Skip to content

智能建議系統測試方案

智能建議系統分析總結

基於對通知系統的深入分析,智能建議系統的完整流程如下:

核心架構

1. 系統必要模板 (8個)

sql
-- 訂單相關 (3個)
'order_new', 'order_high_value', 'order_paid'

-- 產品相關 (2個)  
'product_deactivated', 'product_price_major_change'

-- 客戶相關 (1個)
'customer_new_registration'

-- 庫存相關 (3個)
'inventory_low_stock', 'inventory_out_of_stock', 'inventory_overstock'

2. 智能建議觸發機制

  • orders 表觸發器suggest_completion() 函數
  • products 表觸發器suggest_completion() 函數
  • customers 表觸發器suggest_completion() 函數
  • inventories 表觸發器suggest_inventory_completion() 函數

3. 建議邏輯條件

訂單建議邏輯
  • 付款完成 (pendingpaid): 建議完成 order_new 通知
  • 訂單出貨 (anyshipped): 建議完成 order_new, order_high_value 通知
  • 訂單完成 (anycompleted): 建議完成所有訂單相關通知
  • 訂單取消 (anycancelled): 自動完成所有訂單相關通知
產品建議邏輯
  • 產品重新上架 (inactiveactive): 建議完成 product_deactivated 通知
  • 價格大幅變動 (變動超過50%): 建議完成 product_price_major_change 通知
客戶建議邏輯
  • 客戶資料更新 (姓名/email/電話變更): 建議完成 customer_new_registration 通知 (僅1小時前的)
庫存建議邏輯
  • 庫存補充 (低於閾值 → 高於閾值): 建議完成 inventory_low_stock 通知
  • 缺貨恢復 (0 → >0): 自動完成 inventory_out_of_stock 通知
  • 過多庫存調整 (>10倍閾值 → <5倍閾值): 建議完成 inventory_overstock 通知

✅ 已驗證的智能建議實際測試結果

重要發現:模板自動繼承機制

在實際測試中發現,系統有 auto_inherit_template_properties_trigger 觸發器會自動從 notification_templates 表繼承屬性,包括:

  • category
  • completion_strategy
  • related_entity_type
  • priority
  • channels

關鍵點:要測試智能建議功能,必須將對應模板的 completion_strategy 設為 'suggested',否則會被自動覆蓋為 'manual'

成功驗證的測試場景

場景 A: 訂單取消自動完成測試 ✅

測試步驟

  1. 修改模板策略:UPDATE notification_templates SET completion_strategy = 'suggested' WHERE type = 'order_new';
  2. 建立訂單和通知
  3. 觸發訂單取消
  4. 驗證自動完成

實際執行

sql
-- 步驟1: 建立測試訂單
INSERT INTO orders (
  status, total_amount, contact_name, contact_email, customer_snapshot
) VALUES (
  'pending', 3000, '智能建議測試客戶2', 'ai-test2@example.com',
  '{"customer_id": "ai-test-456", "email": "ai-test2@example.com", "full_name": "智能建議測試客戶2"}'::jsonb
);
-- 返回: id=c7558205-0c98-4b5c-aabe-6663c535afcc, order_number=ORD-2025-000119

-- 步驟2: 建立對應通知
INSERT INTO notifications (
  user_id, type, title, message, priority, category, completion_strategy,
  related_entity_type, related_entity_id, status
) VALUES (
  (SELECT id FROM users WHERE email = 'admin@system.local' LIMIT 1),
  'order_new', '最終智能建議測試 - 訂單 #ORD-2025-000119',
  '測試智能建議自動完成功能', 'high', 'actionable', 'suggested',
  'order', 'c7558205-0c98-4b5c-aabe-6663c535afcc'::uuid, 'unread'
);

-- 步驟3: 觸發訂單取消
UPDATE orders 
SET status = 'cancelled', cancelled_at = NOW(), updated_at = NOW()
WHERE id = 'c7558205-0c98-4b5c-aabe-6663c535afcc'::uuid;

-- 步驟4: 驗證結果 ✅
SELECT id, type, title, status, suggested_complete, auto_completed_at, suggestion_reason
FROM notifications WHERE related_entity_id = 'c7558205-0c98-4b5c-aabe-6663c535afcc'::uuid;

驗證結果

  • ✅ 通知狀態變為 completed
  • auto_completed_at 有時間戳記
  • suggestion_reason = "訂單已取消,相關通知自動完成"
  • suggested_complete = false (已處理完成)

場景 B: 手動智能建議測試 ✅

實際執行

sql
-- 直接建立有智能建議的通知
INSERT INTO notifications (
  user_id, type, title, message, priority, category, completion_strategy,
  related_entity_type, related_entity_id, status,
  suggested_complete, suggested_at, suggestion_reason
) VALUES (
  (SELECT id FROM users WHERE email = 'admin@system.local' LIMIT 1),
  'order_new', '智能建議測試 - 訂單已付款',
  '系統檢測到訂單已完成付款,建議標記為已處理',
  'medium', 'actionable', 'suggested', 'order', gen_random_uuid(), 'unread',
  TRUE, NOW(), '系統建議:訂單已完成付款,建議開始處理'
);

-- 測試接受建議 ✅
SELECT accept_completion_suggestion('9793f010-d345-44e4-be3a-1d6519fa0cf6');
-- 返回: t (成功)

-- 測試拒絕建議 ✅  
SELECT dismiss_completion_suggestion('cab69f2e-ae8a-421e-92dd-97327259c2ca');
-- 返回: t (成功)

驗證結果

  • accept_completion_suggestion() 函數正常運作
  • ✅ 接受建議後通知狀態變為 completed
  • dismiss_completion_suggestion() 函數正常運作
  • ✅ 拒絕建議後 suggested_complete 變為 false

場景 C: 產品價格變動智能建議測試 ✅

實際執行

sql
-- 步驟1: 修改模板策略
UPDATE notification_templates SET completion_strategy = 'suggested' WHERE type = 'product_price_major_change';

-- 步驟2: 建立產品價格變動通知
INSERT INTO notifications (user_id, type, title, message, priority, category, completion_strategy, related_entity_type, related_entity_id, status) VALUES ((SELECT id FROM users WHERE email = 'admin@system.local' LIMIT 1), 'product_price_major_change', '產品價格變動觸發器測試', '測試產品價格大幅變動智能建議', 'medium', 'actionable', 'suggested', 'product', (SELECT id FROM products OFFSET 2 LIMIT 1), 'unread');

-- 步驟3: 觸發價格大幅變動 (降價60%)
UPDATE products SET price = price * 0.4, updated_at = NOW() WHERE id = '81e4ca0c-ce15-449e-b06b-555619920c06'::uuid;

-- 步驟4: 驗證結果
SELECT id, type, title, status, suggested_complete, suggested_at, suggestion_reason FROM notifications WHERE id = '93a04dab-b197-476b-8921-1878b4c80b69';

驗證結果

  • ✅ 觸發器正常運作:trigger_product_suggestions
  • ✅ 智能建議成功生成:suggested_complete = true
  • suggestion_reason = "產品價格已調整完成 (變動 60.0%)"
  • ✅ 價格變動超過50%閾值時自動觸發建議

場景 D: 多種智能建議通知建立成功 ✅

已建立的測試通知

sql
-- 訂單類型智能建議 (2個)
- '🤖 智能建議 - 高價值訂單已付款' (id: 26542897-5ad4-4d1f-8e2f-7f19936f1a2f)
- '🤖 智能建議 - 訂單已出貨' (id: 38bc46df-51be-4386-baa4-2e3791201f83)

-- 庫存類型智能建議 (2個)  
- '🤖 智能建議 - 熱門商品庫存已補充' (id: f9e06b01-0b32-41f8-bf0a-12ea64c755a8)
- '手動測試 - 庫存已補充建議' (id: 7ce11330-3764-4fff-a84a-dbdf7987c049)

-- 產品價格類型智能建議 (3個)
- '🤖 智能建議 - 產品促銷價格已生效' (id: 6d2d3579-d420-428e-9800-c8b0c938a465)
- '產品價格變動觸發器測試' (id: 93a04dab-b197-476b-8921-1878b4c80b69) 
- '產品價格大幅變動' (id: cf0c7b44-4e4b-4946-a2a8-b0f3c2edd341)

統計結果

  • 總計智能建議通知:7個 (pending_suggestions)
  • 分佈:產品價格變動 3個、庫存管理 2個、訂單處理 2個
  • 所有通知狀態:unread + suggested_complete = true
  • 所有通知都有 suggestion_reason 詳細說明

🎮 供手動測試的智能建議通知

以下智能建議通知已保留在資料庫中,可直接在前端進行手動測試:

可測試的智能建議清單

類型標題ID建議內容
訂單處理🤖 智能建議 - 高價值訂單已付款26542897-5ad4-4d1f-8e2f-7f19936f1a2f高價值訂單 ¥5,800 已付款,建議優先處理
訂單處理🤖 智能建議 - 訂單已出貨38bc46df-51be-4386-baa4-2e3791201f83訂單已出貨,追蹤號:TW123456789
庫存管理🤖 智能建議 - 熱門商品庫存已補充f9e06b01-0b32-41f8-bf0a-12ea64c755a8庫存已補充至120件,建議更新庫存狀態
庫存管理手動測試 - 庫存已補充建議7ce11330-3764-4fff-a84a-dbdf7987c049庫存已補充至75件(警戒值:10件)
價格變動🤖 智能建議 - 產品促銷價格已生效6d2d3579-d420-428e-9800-c8b0c938a465促銷價格已調整 -30%,建議更新商品標籤
價格變動產品價格變動觸發器測試93a04dab-b197-476b-8921-1878b4c80b69產品價格已調整完成 (變動 60.0%)
價格變動產品價格大幅變動cf0c7b44-4e4b-4946-a2a8-b0f3c2edd341產品價格已調整完成 (變動 60.0%)

🧪 手動測試指令

sql
-- 測試接受單個建議
SELECT accept_completion_suggestion('26542897-5ad4-4d1f-8e2f-7f19936f1a2f');

-- 測試拒絕單個建議  
SELECT dismiss_completion_suggestion('f9e06b01-0b32-41f8-bf0a-12ea64c755a8');

-- 測試批量接受所有建議
SELECT accept_all_suggestions((SELECT id FROM users WHERE email = 'admin@system.local' LIMIT 1));

-- 查看處理後的狀態
SELECT id, type, title, status, suggested_complete, suggestion_accepted_at, suggestion_dismissed_at 
FROM notifications 
WHERE id IN ('26542897-5ad4-4d1f-8e2f-7f19936f1a2f', 'f9e06b01-0b32-41f8-bf0a-12ea64c755a8');

場景 E: 庫存補充智能建議測試 ✅

實際執行

sql
-- 步驟1: 設定合理的庫存閾值
UPDATE products SET stock_threshold = 10 WHERE id = '1880c57a-5fd0-4ee4-96e2-24b8b9bc1bd4'::uuid;

-- 步驟2: 建立庫存通知
INSERT INTO notifications (user_id, type, title, message, priority, category, completion_strategy, related_entity_type, related_entity_id, status) VALUES ((SELECT id FROM users WHERE email = 'admin@system.local' LIMIT 1), 'inventory_low_stock', '庫存觸發器測試 - 產品需要補貨', '測試庫存補充智能建議功能', 'medium', 'actionable', 'suggested', 'product', '1880c57a-5fd0-4ee4-96e2-24b8b9bc1bd4'::uuid, 'unread');

-- 步驟3: 先降低庫存到閾值以下,再提高觸發建議
UPDATE inventories SET quantity = 5, updated_at = NOW() WHERE product_id = '1880c57a-5fd0-4ee4-96e2-24b8b9bc1bd4'::uuid;
UPDATE inventories SET quantity = 50, updated_at = NOW() WHERE product_id = '1880c57a-5fd0-4ee4-96e2-24b8b9bc1bd4'::uuid;

-- 步驟4: 驗證結果
SELECT id, type, title, status, suggested_complete, suggested_at, suggestion_reason FROM notifications WHERE type = 'inventory_low_stock' AND related_entity_id = '1880c57a-5fd0-4ee4-96e2-24b8b9bc1bd4'::uuid;

驗證結果

  • ✅ 觸發器正常運作:trigger_inventory_suggestions
  • ✅ 智能建議成功生成:suggested_complete = true
  • suggestion_reason = "庫存已補充至 50 件(警戒值:10)"
  • ✅ 庫存補充超過閾值時自動觸發建議

🚨 觸發器問題發現

客戶觸發器錯誤 ❌

問題notify_customer_service_events() 函數中嘗試訪問不存在的 status 欄位

錯誤詳情

sql
-- 函數中的問題代碼
IF NEW.status = 'inactive' AND OLD.status = 'active' THEN

實際問題customers 表沒有 status 欄位,導致任何 UPDATE 操作都會失敗

影響範圍

  • ❌ 客戶資料更新會觸發錯誤
  • ❌ 客戶智能建議無法正常測試
  • ✅ 客戶智能建議邏輯本身正確(suggest_completion 函數中的邏輯沒問題)

解決方案:需要修正 notify_customer_service_events() 函數,移除或修正 status 欄位引用

觸發器測試總結

觸發器類型函數名稱測試狀態智能建議功能備註
訂單觸發器suggest_completion()✅ 正常✅ 完全正常取消自動完成已驗證
產品觸發器suggest_completion()✅ 正常✅ 完全正常價格變動建議已驗證
庫存觸發器suggest_inventory_completion()✅ 正常✅ 完全正常庫存補充建議已驗證
客戶觸發器suggest_completion()⚠️ 部分正常✅ 邏輯正確notify_customer_service_events有錯誤

綜合評估

  • 3/4 觸發器完全正常
  • 智能建議核心功能 100% 正常
  • 客戶觸發器需要修復 ❌ (但不影響智能建議邏輯)

🧪 智能建議測試場景

場景 1: 訂單處理流程測試

sql
-- 步驟1: 建立測試訂單通知
INSERT INTO notifications (
  user_id, type, title, message, priority, category, completion_strategy,
  related_entity_type, related_entity_id, status
) VALUES (
  (SELECT id FROM users WHERE email = 'admin@system.local' LIMIT 1),
  'order_new',
  '新訂單通知 #12345',
  '您有新訂單需要處理',
  'high',
  'actionable',
  'suggested',
  'order',
  '01943ec9-46f2-7c25-8001-23456789abcd'::uuid,
  'unread'
);

-- 步驟2: 建立對應的訂單記錄
INSERT INTO orders (
  id, customer_id, status, total_amount, created_at
) VALUES (
  '01943ec9-46f2-7c25-8001-23456789abcd'::uuid,
  (SELECT id FROM customers LIMIT 1),
  'pending',
  1500,
  NOW() - INTERVAL '30 minutes'
);

-- 步驟3: 觸發付款完成 (應該產生智能建議)
UPDATE orders 
SET status = 'paid', updated_at = NOW() 
WHERE id = '01943ec9-46f2-7c25-8001-23456789abcd'::uuid;

-- 步驟4: 檢查智能建議是否生成
SELECT 
  id, title, suggested_complete, suggested_at, suggestion_reason, status
FROM notifications 
WHERE related_entity_id = '01943ec9-46f2-7c25-8001-23456789abcd'::uuid
  AND type = 'order_new';

場景 2: 產品價格變動測試

sql
-- 步驟1: 建立產品價格變動通知
INSERT INTO notifications (
  user_id, type, title, message, priority, category, completion_strategy,
  related_entity_type, related_entity_id, status
) VALUES (
  (SELECT id FROM users WHERE email = 'admin@system.local' LIMIT 1),
  'product_price_major_change',
  '產品價格大幅變動警示',
  '產品價格變動超過50%',
  'medium',
  'actionable', 
  'suggested',
  'product',
  (SELECT id FROM products LIMIT 1),
  'unread'
);

-- 步驟2: 觸發產品價格變動 (變動超過50%)
UPDATE products 
SET price = price * 0.4, updated_at = NOW()  -- 降價60%
WHERE id = (SELECT related_entity_id FROM notifications WHERE type = 'product_price_major_change' LIMIT 1);

-- 步驟3: 檢查智能建議
SELECT 
  id, title, suggested_complete, suggested_at, suggestion_reason, status
FROM notifications 
WHERE type = 'product_price_major_change' 
  AND created_at > NOW() - INTERVAL '1 hour';

場景 3: 庫存管理測試

sql
-- 步驟1: 建立低庫存警告通知
INSERT INTO notifications (
  user_id, type, title, message, priority, category, completion_strategy,
  related_entity_type, related_entity_id, status
) VALUES (
  (SELECT id FROM users WHERE email = 'admin@system.local' LIMIT 1),
  'inventory_low_stock',
  '低庫存警告',
  '商品庫存不足,需要補貨',
  'medium',
  'actionable',
  'suggested',
  'product',
  (SELECT product_id FROM inventories WHERE quantity < 10 LIMIT 1),
  'unread'
);

-- 步驟2: 觸發庫存補充 (應該產生智能建議)
UPDATE inventories 
SET quantity = 50, updated_at = NOW() 
WHERE product_id = (SELECT related_entity_id FROM notifications WHERE type = 'inventory_low_stock' AND status = 'unread' LIMIT 1);

-- 步驟3: 檢查智能建議
SELECT 
  n.id, n.title, n.suggested_complete, n.suggested_at, n.suggestion_reason, n.status,
  i.quantity as current_quantity
FROM notifications n
JOIN inventories i ON n.related_entity_id = i.product_id
WHERE n.type = 'inventory_low_stock' 
  AND n.created_at > NOW() - INTERVAL '1 hour';

場景 4: 客戶註冊完成測試

sql
-- 步驟1: 建立客戶註冊通知
INSERT INTO notifications (
  user_id, type, title, message, priority, category, completion_strategy,
  related_entity_type, related_entity_id, status
) VALUES (
  (SELECT id FROM users WHERE email = 'admin@system.local' LIMIT 1),
  'customer_new_registration',
  '新客戶註冊',
  '新客戶已完成註冊',
  'low',
  'informational',
  'suggested', 
  'customer',
  (SELECT id FROM customers LIMIT 1),
  'unread'
);

-- 步驟2: 觸發客戶資料更新 (應該產生智能建議)
UPDATE customers 
SET phone = '0912-345-678', updated_at = NOW()
WHERE id = (SELECT related_entity_id FROM notifications WHERE type = 'customer_new_registration' AND status = 'unread' LIMIT 1);

-- 步驟3: 檢查智能建議
SELECT 
  id, title, suggested_complete, suggested_at, suggestion_reason, status
FROM notifications 
WHERE type = 'customer_new_registration' 
  AND created_at > NOW() - INTERVAL '2 hours';

場景 5: 批量建議處理測試

sql
-- 建立多個待處理的建議通知
SELECT 
  'INSERT INTO notifications (user_id, type, title, message, priority, category, completion_strategy, related_entity_type, related_entity_id, status, suggested_complete, suggested_at, suggestion_reason) VALUES ' ||
  '((SELECT id FROM users WHERE email = ''admin@system.local'' LIMIT 1), ' ||
  '''order_new'', ''訂單處理建議 #' || generate_random_uuid() || ''', ''建議處理此訂單'', ''medium'', ''actionable'', ''suggested'', ''order'', ''' || generate_random_uuid() || '''::uuid, ''unread'', TRUE, NOW(), ''系統建議處理'');'
FROM generate_series(1, 5);

-- 測試批量接受建議
SELECT accept_all_suggestions((SELECT id FROM users WHERE email = 'admin@system.local' LIMIT 1));

-- 檢查批量處理結果
SELECT COUNT(*) as completed_suggestions
FROM notifications 
WHERE user_id = (SELECT id FROM users WHERE email = 'admin@system.local' LIMIT 1)
  AND status = 'completed'
  AND suggestion_accepted_at IS NOT NULL;

手動建立智能建議測試資料的方法

方法 1: 完整流程模擬

bash
# 1. 連接到資料庫
PGPASSWORD=postgres psql -h localhost -p 54322 -U postgres -d postgres

# 2. 執行完整測試場景
\i /path/to/test_scenarios.sql

方法 2: 直接建立建議狀態的通知

sql
-- 直接建立已有智能建議的通知
INSERT INTO notifications (
  user_id, type, title, message, priority, category, completion_strategy,
  related_entity_type, related_entity_id, status,
  suggested_complete, suggested_at, suggestion_reason
) VALUES (
  (SELECT id FROM users WHERE email = 'admin@system.local' LIMIT 1),
  'order_new',
  '測試智能建議通知',
  '這是一個測試智能建議的通知',
  'medium',
  'actionable',
  'suggested', 
  'order',
  generate_random_uuid(),
  'unread',
  TRUE,  -- 已有智能建議
  NOW(),
  '系統建議:訂單已處理完成,可標記為完成'
);

方法 3: 使用 API 函數測試

sql
-- 1. 建立基礎通知
SELECT create_smart_notification(
  'order_new',
  '智能建議測試訂單',
  '測試智能建議功能的訂單通知',
  'actionable',
  'suggested',
  'medium',
  'order',
  generate_random_uuid(),
  '/orders/test',
  '{"test": true}'::jsonb,
  (SELECT id FROM users WHERE email = 'admin@system.local' LIMIT 1)
);

-- 2. 測試接受建議
SELECT accept_completion_suggestion('[notification_id]');

-- 3. 測試拒絕建議  
SELECT dismiss_completion_suggestion('[notification_id]');

-- 4. 測試批量接受
SELECT accept_all_suggestions('[user_id]');

方法 4: 前端測試整合

javascript
// 在 Vue 開發者工具或瀏覽器 Console 中執行
// 1. 建立測試通知
await $api.notification.createNotification({
  type: 'order_new',
  title: '前端測試智能建議',
  message: '測試前端智能建議功能',
  priority: 'medium',
  category: 'actionable',
  completionStrategy: 'suggested',
  relatedEntityType: 'order',
  relatedEntityId: crypto.randomUUID(),
  metadata: { test: true }
});

// 2. 手動設定建議狀態 (透過資料庫)
// 然後在前端測試接受/拒絕建議功能

智能建議效果驗證

檢查建議生成

sql
-- 查看所有智能建議
SELECT 
  type, title, suggestion_reason, suggested_at, 
  status, created_at
FROM notifications 
WHERE suggested_complete = TRUE 
ORDER BY suggested_at DESC 
LIMIT 10;

檢查觸發器運作

sql
-- 檢查觸發器狀態
SELECT 
  trigger_name, event_object_table, action_timing, event_manipulation
FROM information_schema.triggers 
WHERE trigger_name LIKE '%suggest%';

檢查系統模板保護

sql
-- 驗證系統模板保護機制
SELECT type, is_system_required, is_active 
FROM notification_templates 
WHERE is_system_required = TRUE;

效能監控

sql
-- 查看建議接受率
SELECT 
  COUNT(CASE WHEN suggestion_accepted_at IS NOT NULL THEN 1 END) * 100.0 / 
  COUNT(CASE WHEN suggested_complete = TRUE THEN 1 END) as acceptance_rate
FROM notifications 
WHERE created_at > NOW() - INTERVAL '7 days';

⚡ 快速測試指令

bash
# 建立完整測試環境
cat << 'EOF' | PGPASSWORD=postgres psql -h localhost -p 54322 -U postgres -d postgres
-- 清理測試資料
DELETE FROM notifications WHERE title LIKE '%測試%' OR title LIKE '%test%';

-- 建立訂單建議測試
INSERT INTO notifications (user_id, type, title, message, priority, category, completion_strategy, related_entity_type, related_entity_id, status, suggested_complete, suggested_at, suggestion_reason) VALUES ((SELECT id FROM users WHERE email = 'admin@system.local' LIMIT 1), 'order_new', '智能建議測試-訂單', '測試訂單智能建議', 'medium', 'actionable', 'suggested', 'order', gen_random_uuid(), 'unread', TRUE, NOW(), '系統建議:訂單狀態已更新');

-- 建立庫存建議測試  
INSERT INTO notifications (user_id, type, title, message, priority, category, completion_strategy, related_entity_type, related_entity_id, status, suggested_complete, suggested_at, suggestion_reason) VALUES ((SELECT id FROM users WHERE email = 'admin@system.local' LIMIT 1), 'inventory_low_stock', '智能建議測試-庫存', '測試庫存智能建議', 'medium', 'actionable', 'suggested', 'product', (SELECT id FROM products LIMIT 1), 'unread', TRUE, NOW(), '系統建議:庫存已補充');

-- 查看建立的測試資料
SELECT id, type, title, suggested_complete, suggestion_reason FROM notifications WHERE title LIKE '%智能建議測試%';
EOF

此測試方案提供了完整的智能建議系統驗證流程,涵蓋所有業務場景和技術實現細節。