Skip to content

Ví Dụ Tích Hợp ​

Dưới đây là một số ví dụ về cách tích hợp và sử dụng Pancake POS SDK trong các tình huống thực tế.

Quản Lý Đơn Hàng Express.js ​

typescript
import express from 'express';
import { PancakeClient } from 'pancake-client-sdk';

const app = express();
app.use(express.json());

// Khởi tạo Pancake client
const client = new PancakeClient(process.env.PANCAKE_API_KEY, process.env.SHOP_ID);

// API lấy danh sách đơn hàng
app.get('/orders', async (req, res) => {
  try {
    const { page = 1, status } = req.query;
    const { data: orders } = await client.orders.list({
      page_number: Number(page),
      page_size: 20,
      status: Number(status)
    });
    res.json(orders);
  } catch (error) {
    res.status(500).json({ error: error.message });
  }
});

// API tạo đơn hàng mới
app.post('/orders', async (req, res) => {
  try {
    const order = await client.orders.create({
      shop_id: process.env.SHOP_ID,
      shipping_address: req.body.shipping_address,
      items: req.body.items
    });
    res.json(order);
  } catch (error) {
    res.status(500).json({ error: error.message });
  }
});

app.listen(3000, () => {
  console.log('Server running on port 3000');
});

Đồng Bộ Sàn TMĐT ​

typescript
import { PancakeClient } from 'pancake-client-sdk';

class MarketplaceSyncService {
  private client: PancakeClient;

  constructor(apiKey: string, shopId: string) {
    this.client = new PancakeClient(apiKey, shopId);
  }

  // Đồng bộ đơn hàng từ sàn
  async syncOrders(platform: string, fromDate: string) {
    try {
      // Kết nối tài khoản marketplace
      const account = await this.client.marketplace.connect({
        platform,
        auth_code: process.env.MARKETPLACE_AUTH_CODE
      });

      // Bắt đầu đồng bộ
      await this.client.marketplace.startSync(account.id, 'orders', {
        from_date: fromDate
      });

      console.log('Đã bắt đầu đồng bộ đơn hàng');
    } catch (error) {
      console.error('Lỗi đồng bộ:', error);
    }
  }

  // Xử lý webhook từ sàn
  async handleWebhook(event: any) {
    try {
      switch (event.type) {
        case 'order.created':
          await this.syncNewOrder(event.data);
          break;
        case 'order.updated':
          await this.updateOrderStatus(event.data);
          break;
      }
    } catch (error) {
      console.error('Lỗi xử lý webhook:', error);
    }
  }

  private async syncNewOrder(data: any) {
    // Tạo đơn hàng mới từ dữ liệu sàn
    await this.client.orders.create({
      shop_id: this.client.shopId,
      shipping_address: data.shipping_address,
      items: data.items.map(item => ({
        product_id: item.product_id,
        variation_id: item.variation_id,
        quantity: item.quantity
      }))
    });
  }

  private async updateOrderStatus(data: any) {
    // Cập nhật trạng thái đơn hàng
    await this.client.orders.update(data.order_id, {
      status: data.new_status
    });
  }
}

Tích Hợp Thanh Toán ​

typescript
import { PancakeClient } from 'pancake-client-sdk';

class PaymentService {
  private client: PancakeClient;

  constructor(apiKey: string, shopId: string) {
    this.client = new PancakeClient(apiKey, shopId);
  }

  // Tạo thanh toán cho đơn hàng
  async createPayment(orderId: string, method: string) {
    try {
      // Lấy thông tin đơn hàng
      const order = await this.client.orders.getById(orderId);

      // Tạo thanh toán
      const payment = await this.client.payments.createPayment({
        order_id: orderId,
        amount: order.total_amount,
        currency: 'VND',
        gateway_code: method,
        success_url: `${process.env.BASE_URL}/payment/success`,
        cancel_url: `${process.env.BASE_URL}/payment/cancel`
      });

      return payment;
    } catch (error) {
      console.error('Lỗi tạo thanh toán:', error);
      throw error;
    }
  }

  // Xử lý webhook thanh toán
  async handlePaymentWebhook(event: any) {
    try {
      const { order_id, status } = event.data;

      if (status === 'succeeded') {
        // Cập nhật trạng thái đơn hàng
        await this.client.orders.update(order_id, {
          status: 2, // Đã thanh toán
          payment_status: 'paid'
        });
      }
    } catch (error) {
      console.error('Lỗi xử lý webhook thanh toán:', error);
    }
  }
}

Quản Lý Kho Thời Gian Thực ​

typescript
import { PancakeClient } from 'pancake-client-sdk';

class InventoryManager {
  private client: PancakeClient;

  constructor(apiKey: string, shopId: string) {
    this.client = new PancakeClient(apiKey, shopId);
  }

  // Kiểm tra và cập nhật tồn kho
  async checkAndUpdateStock(productId: string, quantity: number) {
    try {
      // Lấy thông tin tồn kho hiện tại
      const stock = await this.client.warehouses.getStock(
        process.env.WAREHOUSE_ID,
        productId
      );

      if (stock.available < quantity) {
        throw new Error('Không đủ hàng trong kho');
      }

      // Cập nhật tồn kho
      await this.client.warehouses.adjustStock(
        process.env.WAREHOUSE_ID,
        productId,
        -quantity,
        'Đã bán'
      );

      return true;
    } catch (error) {
      console.error('Lỗi kiểm tra tồn kho:', error);
      throw error;
    }
  }

  // Đồng bộ tồn kho giữa các kênh bán
  async syncInventory() {
    try {
      const { data: warehouses } = await this.client.warehouses.list();

      for (const warehouse of warehouses) {
        // Lấy danh sách sản phẩm trong kho
        const { data: products } = await this.client.products.list({
          warehouse_id: warehouse.id
        });

        // Cập nhật tồn kho cho từng sản phẩm
        for (const product of products) {
          const stock = await this.client.warehouses.getStock(
            warehouse.id,
            product.id
          );

          // Đồng bộ với các kênh bán
          await this.syncStockToChannels(product.id, stock.available);
        }
      }
    } catch (error) {
      console.error('Lỗi đồng bộ tồn kho:', error);
    }
  }

  private async syncStockToChannels(productId: string, quantity: number) {
    // Thực hiện đồng bộ với các kênh bán
    const { data: channels } = await this.client.marketplace.listChannels();

    for (const channel of channels) {
      if (channel.connected) {
        await this.client.marketplace.updateStock(channel.id, productId, quantity);
      }
    }
  }
}