top of page

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 秒執行,確保所有相關資料都已準備好
}

最新文章

查看全部
Wix 網頁設計 - mailgunService.jsw

// backend/mailgunService.jsw // 導入 Wix Velo 內建的 fetch API,用於發送 HTTP 請求 import { fetch } from 'wix-fetch'; // 導入 Wix Secrets...

 
 
 
Wix 網頁設計 - storeUtils

// backend/storeUtils.jsw import wixData from 'wix-data'; import { currentCart } from 'wix-ecom-backend'; import { authentication } from...

 
 
 

留言


創客爸爸.png

TRUNK DADDY

​歡迎訂閱

感謝你的訂閱,你將不會錯過任何一個最新的訊息

創客爸爸

© 2024 by TRUNKDADDY

bottom of page