Wix 網頁設計 - event.js
- 作 振
- 2025年6月13日
- 讀畢需時 3 分鐘
// backend/events.jsw
// 導入 Wix 資料庫模組,用於查詢和更新 CMS 集合
import wixData from 'wix-data';
// 從後端服務檔案導入您自定義的 Mailgun 郵件發送函數
import { sendMailgunEmail } from 'backend/mailgunService';
console.log("events.jsw 檔案已載入。");
/**
* 當 Wix Stores 接收到新訂單時觸發的後端事件。
* 此函數會處理訂單資料,查詢預計出貨日期,並發送訂單確認郵件。
* * @param {object} event - 包含新訂單詳細資訊的事件物件。
*/
export function wixStores_onNewOrder(event) {
console.log("進入 wixStores_onNewOrder 函數 (新訂單觸發)。");
// 印出完整的 event 物件以便偵錯
console.log("完整的事件物件 (event):", event);
// 從事件物件中正確取得訂單資料
const order = event;
// 檢查訂單物件是否確實被定義
if (!order) {
console.error("後端 events: 無法從事件中取得訂單物件,event.data 為 undefined。");
console.error("偵錯資訊:完整的 event 物件為", event);
return; // 如果沒有訂單物件,就停止執行
}
const finalOrderId = order._id;
const orderCheckoutId = order.checkoutId;
const orderCartId = order.cartId;
console.log(`後端 events: 訂單已建立。最終訂單ID (order._id): ${finalOrderId}`);
console.log(`後端 events: 訂單中的 checkoutId (order.checkoutId): ${orderCheckoutId}`);
console.log(`後端 events: 訂單中的 cartId (order.cartId): ${orderCartId}`);
// 使用 setTimeout 延遲執行,確保所有相關資料(例如 Delivery Date)有足夠時間寫入 CMS
setTimeout(async () => {
try {
// 使用 cartId 或 checkoutId 來查詢相關資料
const queryId = orderCartId || orderCheckoutId;
let deliveryDate = "未提供"; // 預設值
if (queryId) {
// 查詢 CMS 集合 "OrderDeliveryDates" 以獲取預計出貨日期
const relevantEntries = await wixData.query("OrderDeliveryDates")
.eq("cartId", queryId) // 根據 cartId 匹配
.eq("status", "pending") // 狀態為 "pending" 的記錄
.descending("_createdDate") // 獲取最新創建的記錄
.find();
console.log(`後端 events: 查詢到 ${relevantEntries.items.length} 條相關的待處理日期記錄 (基於查詢 ID: ${queryId})。`);
if (relevantEntries.items.length > 0) {
const latestEntry = relevantEntries.items[0]; // 獲取最新的記錄
// 格式化 deliveryDate
if (latestEntry.deliveryDate instanceof Date && !isNaN(latestEntry.deliveryDate)) {
deliveryDate = latestEntry.deliveryDate.toLocaleDateString('zh-TW', { year: 'numeric', month: 'long', day: 'numeric' });
} else {
console.warn(`後端 events: 記錄 ID ${latestEntry._id} 的 deliveryDate 無效或不是 Date 物件。`);
deliveryDate = String(latestEntry.deliveryDate || "日期無效");
}
// 更新 CMS 記錄:將 orderId 關聯並設置狀態為 "completed"
latestEntry.orderId = finalOrderId;
latestEntry.status = "completed";
await wixData.update("OrderDeliveryDates", latestEntry);
console.log(`後端 events: 已將最新日期記錄 (ID: ${latestEntry._id}) 更新為最終訂單 ID: ${finalOrderId} 並標記為 completed。`);
// 刪除所有舊的、重複的 "pending" 狀態記錄
for (const item of relevantEntries.items) {
if (item._id !== latestEntry._id) {
await wixData.remove("OrderDeliveryDates", item._id);
console.log(`後端 events: 已刪除重複的舊日期記錄 (ID: ${item._id})。`);
}
}
} else {
console.warn(`後端 events: 未找到與查詢 ID: ${queryId} 匹配的待處理日期記錄。訂單郵件中的日期將顯示為「未提供」。`);
}
} else {
console.warn("後端 events: 無法從訂單事件中獲取有效的 cartId 或 checkoutId 進行查詢。");
}
console.log('這是order的內容: ', order)
// --- 發送訂單確認郵件的邏輯 ---
const subject = `您的訂單 #${order.number} 已確認 - 預計出貨日期通知`;
const customerFirstName = order.buyerInfo.firstName || '';
const greetingName = customerFirstName ? customerFirstName : '客戶';
const customerEmail = order.buyerInfo.email; // 顧客的電子郵件地址
// 構建郵件的 HTML 內容
// 首先,安全地獲取訂單商品列表
const orderItemsHtml = (order.lineItems && Array.isArray(order.lineItems) && order.lineItems.length > 0)
? order.lineItems.map(item => `<li>${item.quantity} x ${item.productName.original}</li>`).join('')
: '<li>無商品資訊</li>'; // 如果沒有商品,顯示替代文字
const htmlBody = `
<p>親愛的 ${greetingName} 您好,</p>
<p>感謝您的訂購!您的訂單號碼是:<strong>${order.number}</strong>。</p>
<p>訂單總金額:<strong>${order.totals.total}</strong></p>
<p>您訂購的商品:</p>
<ul>
${orderItemsHtml}
</ul>
<p>您選擇的<strong>預計出貨日期為:${deliveryDate}</strong></p>
<p>我們會盡快處理您的訂單。如果您有任何問題,請隨時與我們聯繫。</p>
<p>謝謝您!</p>
<p>您的商店團隊</p>
`;
// 使用 Mailgun 服務發送訂單確認郵件
// 傳入顧客信箱、主旨、HTML 內容,並可選地重複 HTML 內容作為純文本內容
const sendResult = await sendMailgunEmail(customerEmail, subject, htmlBody, htmlBody);
if (sendResult.success) {
console.log(`後端 events: 已成功發送訂單確認郵件給 ${customerEmail},包含出貨日期。郵件 ID: ${sendResult.messageId}`);
} else {
console.error(`後端 events: 發送訂單確認郵件失敗 (訂單 ID: ${order.number}):`, sendResult.error);
}
} catch (error) {
console.error(`後端 events: 處理訂單事件或發送郵件時發生錯誤 (訂單 ID: ${order.number}):`, error);
}
}, 3000); // 延遲 3 秒執行,確保所有相關資料都已準備好
}
留言