|
""" |
|
測試訂單查詢功能 - 基於實際銷售訂單資料 |
|
""" |
|
|
|
def test_order_number_extraction(): |
|
"""測試訂單編號提取功能""" |
|
|
|
def extract_order_number_simple(message: str) -> str: |
|
"""簡化版訂單編號提取""" |
|
import re |
|
|
|
|
|
so_pattern = r'SO-\d{8}-\d{3}' |
|
match = re.search(so_pattern, message.upper()) |
|
if match: |
|
return match.group() |
|
|
|
|
|
date_pattern = r'\d{8}-\d{3}' |
|
match = re.search(date_pattern, message) |
|
if match: |
|
return f"SO-{match.group()}" |
|
|
|
|
|
number_pattern = r'\d{6,}' |
|
match = re.search(number_pattern, message) |
|
if match: |
|
return match.group() |
|
|
|
return None |
|
|
|
print("🔍 測試訂單編號提取") |
|
print("=" * 50) |
|
|
|
test_queries = [ |
|
"查詢訂單 SO-20250706-001", |
|
"我的訂單 SO-20250708-001 狀態如何?", |
|
"20250706-001 這個訂單", |
|
"訂單編號 20250708-001", |
|
"SO20250706001", |
|
"查詢我的訂單", |
|
] |
|
|
|
for query in test_queries: |
|
order_number = extract_order_number_simple(query) |
|
print(f"'{query}' → 訂單編號: {order_number}") |
|
|
|
def test_order_status_extraction(): |
|
"""測試訂單狀態提取功能""" |
|
|
|
def extract_order_status_simple(message: str) -> str: |
|
"""簡化版訂單狀態提取""" |
|
message_lower = message.lower() |
|
|
|
|
|
status_keywords = { |
|
'已交付': 'DELIVERED', |
|
'已出貨': 'SHIPPED', |
|
'出貨': 'SHIPPED', |
|
'交付': 'DELIVERED', |
|
'處理中': 'PROCESSING', |
|
'已取消': 'CANCELLED', |
|
'取消': 'CANCELLED', |
|
'待處理': 'PENDING', |
|
'已確認': 'CONFIRMED', |
|
'已完成': 'COMPLETED' |
|
} |
|
|
|
for chinese, english in status_keywords.items(): |
|
if chinese in message_lower: |
|
return english |
|
|
|
|
|
english_keywords = ['delivered', 'shipped', 'processing', 'cancelled', 'pending', 'confirmed', 'completed'] |
|
for keyword in english_keywords: |
|
if keyword in message_lower: |
|
return keyword.upper() |
|
|
|
return None |
|
|
|
print("\n📊 測試訂單狀態提取") |
|
print("=" * 50) |
|
|
|
test_queries = [ |
|
"查詢已交付的訂單", |
|
"已出貨訂單有哪些?", |
|
"處理中的訂單", |
|
"DELIVERED 狀態的訂單", |
|
"shipped orders", |
|
"我的訂單狀態", |
|
] |
|
|
|
for query in test_queries: |
|
status = extract_order_status_simple(query) |
|
print(f"'{query}' → 狀態: {status}") |
|
|
|
def test_order_query_simulation(): |
|
"""模擬訂單查詢功能""" |
|
|
|
|
|
orders = [ |
|
{ |
|
"id": 1, |
|
"so_number": "SO-20250706-001", |
|
"sales_date": "2025-07-06", |
|
"customer_id": 1, |
|
"salesperson_id": 1, |
|
"payment_term": "MONTHLY", |
|
"status": "DELIVERED", |
|
"subtotal": 0, |
|
"tax_amount": 0, |
|
"discount_amount": 0, |
|
"total_amount": 0, |
|
"created_at": "2025-07-06 14:53:23", |
|
"updated_at": "2025-07-06 14:55:18" |
|
}, |
|
{ |
|
"id": 2, |
|
"so_number": "SO-20250708-001", |
|
"sales_date": "2025-07-08", |
|
"customer_id": 1, |
|
"salesperson_id": 1, |
|
"payment_term": "CASH", |
|
"status": "SHIPPED", |
|
"subtotal": 0, |
|
"tax_amount": 0, |
|
"discount_amount": 0, |
|
"total_amount": 0, |
|
"created_at": "2025-07-08 06:24:34", |
|
"updated_at": "2025-07-10 07:08:12" |
|
} |
|
] |
|
|
|
def search_orders_simulation(order_number=None, status=None): |
|
"""模擬訂單搜尋""" |
|
results = [] |
|
|
|
for order in orders: |
|
match = True |
|
|
|
|
|
if order_number: |
|
if order_number not in order["so_number"]: |
|
match = False |
|
|
|
|
|
if status: |
|
if status.upper() != order["status"]: |
|
match = False |
|
|
|
if match: |
|
results.append(order) |
|
|
|
return results |
|
|
|
def get_status_display(status): |
|
"""狀態中文顯示""" |
|
status_mapping = { |
|
'DELIVERED': '已交付', |
|
'SHIPPED': '已出貨', |
|
'PROCESSING': '處理中', |
|
'CANCELLED': '已取消', |
|
'PENDING': '待處理' |
|
} |
|
return status_mapping.get(status, status) |
|
|
|
print("\n🛍️ 測試訂單查詢模擬") |
|
print("=" * 50) |
|
|
|
test_scenarios = [ |
|
{"query": "查詢訂單 SO-20250706-001", "order_number": "SO-20250706-001", "status": None}, |
|
{"query": "已交付的訂單", "order_number": None, "status": "DELIVERED"}, |
|
{"query": "已出貨訂單", "order_number": None, "status": "SHIPPED"}, |
|
{"query": "我的所有訂單", "order_number": None, "status": None}, |
|
{"query": "SO-20250708-001 狀態", "order_number": "SO-20250708-001", "status": None}, |
|
] |
|
|
|
for scenario in test_scenarios: |
|
print(f"\n查詢: '{scenario['query']}'") |
|
results = search_orders_simulation( |
|
order_number=scenario["order_number"], |
|
status=scenario["status"] |
|
) |
|
|
|
print(f"找到 {len(results)} 個訂單:") |
|
for order in results: |
|
status_display = get_status_display(order["status"]) |
|
print(f" ✅ {order['so_number']} - {status_display} - {order['sales_date']} - 付款: {order['payment_term']}") |
|
|
|
def test_natural_language_processing(): |
|
"""測試自然語言處理""" |
|
|
|
print("\n🤖 測試自然語言訂單查詢") |
|
print("=" * 50) |
|
|
|
def extract_order_number_simple(message: str) -> str: |
|
import re |
|
so_pattern = r'SO-\d{8}-\d{3}' |
|
match = re.search(so_pattern, message.upper()) |
|
if match: |
|
return match.group() |
|
|
|
date_pattern = r'\d{8}-\d{3}' |
|
match = re.search(date_pattern, message) |
|
if match: |
|
return f"SO-{match.group()}" |
|
|
|
return None |
|
|
|
def extract_order_status_simple(message: str) -> str: |
|
message_lower = message.lower() |
|
status_keywords = { |
|
'已交付': 'DELIVERED', |
|
'已出貨': 'SHIPPED', |
|
'出貨': 'SHIPPED', |
|
'交付': 'DELIVERED', |
|
'處理中': 'PROCESSING' |
|
} |
|
|
|
for chinese, english in status_keywords.items(): |
|
if chinese in message_lower: |
|
return english |
|
|
|
return None |
|
|
|
natural_queries = [ |
|
"請問我的訂單 SO-20250706-001 現在是什麼狀態?", |
|
"查詢已交付的所有訂單", |
|
"20250708-001 這個訂單出貨了嗎?", |
|
"我有哪些已出貨的訂單?", |
|
"訂單狀態查詢" |
|
] |
|
|
|
for query in natural_queries: |
|
print(f"\n自然語言查詢: '{query}'") |
|
order_number = extract_order_number_simple(query) |
|
status = extract_order_status_simple(query) |
|
|
|
print(f" 提取的訂單編號: {order_number}") |
|
print(f" 提取的狀態: {status}") |
|
|
|
|
|
if order_number and status: |
|
query_type = "特定訂單狀態查詢" |
|
elif order_number: |
|
query_type = "特定訂單查詢" |
|
elif status: |
|
query_type = "狀態篩選查詢" |
|
else: |
|
query_type = "一般訂單查詢" |
|
|
|
print(f" 查詢類型: {query_type}") |
|
|
|
def main(): |
|
"""主函數""" |
|
print("🚀 開始訂單查詢功能測試\n") |
|
|
|
test_order_number_extraction() |
|
test_order_status_extraction() |
|
test_order_query_simulation() |
|
test_natural_language_processing() |
|
|
|
print("\n" + "=" * 50) |
|
print("✅ 測試完成!") |
|
print("\n💡 分析結果:") |
|
print("1. 訂單編號提取邏輯能正確識別 SO- 格式") |
|
print("2. 狀態提取支援中文和英文") |
|
print("3. 查詢模擬能正確篩選訂單") |
|
print("4. 自然語言處理能提取關鍵資訊") |
|
|
|
if __name__ == "__main__": |
|
main() |
|
|