庫存創建者系統重新設計 - 部署指南
修復總結
核心問題解決
✅ 外鍵約束錯誤: inventory_logs_created_by_fkey 違反問題已解決
✅ 創建者類型支援: 支援管理員和客戶兩種創建者類型
✅ 未來擴展性: 為客戶自助下單功能做好準備
✅ 資料完整性: 外鍵約束確保創建者 ID 有效性
重新設計架構
- 新欄位:
created_by_user(uuid → users.id),created_by_customer(uuid → customers.id) - 約束機制: 確保只有一個創建者類型(或兩者皆為 NULL)
- 輔助視圖:
inventory_logs_with_creator統一創建者資訊 - 函數更新: 所有相關函數支援新的創建者參數格式
部署檔案清單
資料庫遷移檔案
20250730200000_redesign_inventory_logs_creators.sql- 修改
inventory_logs表結構 - 建立輔助視圖和函數
- 更新觸發器和索引
- 修改
20250730210000_fix_create_order_with_new_creator_params.sql- 修正
create_order_with_items函數 - 使用新的創建者參數格式
- 修正
Edge Functions 更新
/supabase/functions/stock-in/index.ts- 新增用戶身份解析邏輯
- 支援管理員/客戶創建者類型
/supabase/functions/stock-adjust/index.ts- 新增用戶身份解析邏輯
- 使用新的 RPC 參數格式
/supabase/functions/order-create/index.ts- 修正
created_by參數使用管理員 ID
- 修正
部署步驟
Step 1: 資料庫遷移
bash
# 執行主要遷移(重新設計創建者系統)
psql -h [你的主機] -p [端口] -U [用戶名] -d [資料庫名] -f /Users/yangyachiao/Documents/2025/ecommerce-dashboard/supabase/migrations/20250730200000_redesign_inventory_logs_creators.sql
# 執行訂單函數修正
psql -h [你的主機] -p [端口] -U [用戶名] -d [資料庫名] -f /Users/yangyachiao/Documents/2025/ecommerce-dashboard/supabase/migrations/20250730210000_fix_create_order_with_new_creator_params.sqlStep 2: 部署 Edge Functions
bash
# 重新部署所有更新的 Edge Functions
supabase functions deploy stock-in
supabase functions deploy stock-adjust
supabase functions deploy order-createStep 3: 驗證部署
sql
-- 1. 檢查表結構
\d inventory_logs;
-- 2. 檢查約束
SELECT constraint_name, check_clause
FROM information_schema.check_constraints
WHERE table_name = 'inventory_logs';
-- 3. 檢查視圖
SELECT * FROM inventory_logs_with_creator LIMIT 5;
-- 4. 檢查函數
SELECT proname FROM pg_proc WHERE proname IN (
'log_inventory_operation',
'allocate_stock_fifo',
'adjust_inventory_stock',
'create_order_with_items'
);🧪 功能測試
Test Case 1: 管理員入庫操作
bash
# 使用 stock-in Edge Function
curl -X POST "http://localhost:54321/functions/v1/stock-in" \
-H "Authorization: Bearer [ADMIN_JWT_TOKEN]" \
-H "Content-Type: application/json" \
-d '{
"product_id": "product-id-here",
"quantity": 10,
"note": "管理員手動入庫測試"
}'預期結果:
- ✅
inventories表新增記錄 - ✅
inventory_logs表新增 'in' 記錄 - ✅
created_by_user欄位填入管理員 ID - ✅
created_by_customer欄位為 NULL
Test Case 2: 管理員建立訂單
bash
# 使用 order-create Edge Function
curl -X POST "http://localhost:54321/functions/v1/order-create" \
-H "Authorization: Bearer [ADMIN_JWT_TOKEN]" \
-H "Content-Type: application/json" \
-d '{
"order_data": {"userId": "customer-id-here"},
"items": [{"productId": "product-id-here", "quantity": 2, "unitPrice": 100}]
}'預期結果:
- ✅
orders表新增記錄,user_id為客戶 ID - ✅
inventory_logs表新增 'out' 記錄 - ✅
created_by_user欄位填入管理員 ID - ✅
created_by_customer欄位為 NULL
Test Case 3: 庫存調整
bash
# 使用 stock-adjust Edge Function
curl -X POST "http://localhost:54321/functions/v1/stock-adjust" \
-H "Authorization: Bearer [ADMIN_JWT_TOKEN]" \
-H "Content-Type: application/json" \
-d '{
"inventory_id": "inventory-id-here",
"adjust_quantity": 5,
"reason": "盤點調整"
}'🔍 驗證查詢
查看創建者資訊
sql
-- 統一查看所有庫存操作記錄
SELECT
id, type, quantity, source, note,
creator_type, creator_name, creator_email,
created_at
FROM inventory_logs_with_creator
ORDER BY created_at DESC
LIMIT 10;查看管理員操作記錄
sql
-- 查看特定管理員的操作記錄
SELECT * FROM inventory_logs_with_creator
WHERE creator_type = 'user'
AND created_by_user = 'admin-user-id-here'
ORDER BY created_at DESC;檢查資料完整性
sql
-- 檢查是否有違反約束的記錄
SELECT COUNT(*) FROM inventory_logs
WHERE (created_by_user IS NOT NULL AND created_by_customer IS NOT NULL);
-- 應該回傳 0
-- 檢查外鍵完整性
SELECT COUNT(*) FROM inventory_logs il
LEFT JOIN users u ON il.created_by_user = u.id
LEFT JOIN customers c ON il.created_by_customer = c.id
WHERE (il.created_by_user IS NOT NULL AND u.id IS NULL)
OR (il.created_by_customer IS NOT NULL AND c.id IS NULL);
-- 應該回傳 0業務流程確認
當前支援情境
- ✅ 後台管理員手動入庫:
created_by_user記錄管理員 - ✅ 後台管理員建立訂單:
created_by_user記錄管理員 - ✅ 後台管理員調整庫存:
created_by_user記錄管理員
未來支援情境(已準備就緒)
- 🔄 客戶自助下單:
created_by_customer記錄客戶 - 🔄 客戶申請退貨:
created_by_customer記錄客戶
系統自動操作
- ✅ 定時任務: 兩個創建者欄位皆為 NULL
🚨 問題排查
常見問題
Edge Function 401 錯誤
- 檢查用戶是否存在於
users或customers表中 - 檢查
auth_user_id欄位是否正確設定
- 檢查用戶是否存在於
外鍵約束錯誤
- 確保遷移已正確執行
- 檢查創建者 ID 是否有效
RPC 函數錯誤
- 檢查函數參數名稱是否正確
- 確認函數簽名已更新
除錯指令
sql
-- 檢查用戶身份映射
SELECT 'users' as table_name, count(*) as count FROM users
UNION ALL
SELECT 'customers' as table_name, count(*) as count FROM customers;
-- 檢查近期的庫存操作
SELECT * FROM inventory_logs_with_creator
WHERE created_at >= NOW() - INTERVAL '1 hour'
ORDER BY created_at DESC;效能影響
- 索引優化: 已為新的創建者欄位建立適當索引
- 查詢效能: 輔助視圖提供統一的創建者資訊查詢
- 儲存成本: 增加兩個 UUID 欄位,影響微小
部署版本: v2.0
部署日期: 2025-07-30
相容性: 完全向前相容,支援未來擴展
風險等級: 低(外鍵約束保證資料完整性)