Skip to content

API Đánh Giá (Reviews)

Module Reviews cung cấp các phương thức để quản lý đánh giá sản phẩm từ khách hàng, bao gồm cả đánh giá nội bộ và đánh giá từ các sàn thương mại điện tử.

Khởi Tạo

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

const client = new PancakeClient('your-api-key', 'your-shop-id');
const reviewsApi = client.reviews;

Quản Lý Đánh Giá

Lấy Danh Sách Đánh Giá

typescript
const { data: reviews } = await client.reviews.list({
  page_size: 20,
  page_number: 1,
  min_rating: 4,
  has_images: true,
  platform: 'shopee'
});

Tham Số Lọc

TênKiểuBắt buộcMô tả
page_sizenumberkhôngSố đánh giá trên trang
page_numbernumberkhôngSố trang
product_idstringkhôngLọc theo sản phẩm
customer_idstringkhôngLọc theo khách hàng
platformstringkhôngNền tảng: 'internal', 'shopee', 'lazada', 'tiktok'
statusstringkhôngTrạng thái: 'pending', 'approved', 'rejected'
min_ratingnumberkhôngĐiểm đánh giá tối thiểu (1-5)
max_ratingnumberkhôngĐiểm đánh giá tối đa (1-5)
has_imagesbooleankhôngChỉ lấy đánh giá có hình ảnh
from_datestringkhôngTừ ngày (YYYY-MM-DD)
to_datestringkhôngĐến ngày (YYYY-MM-DD)

Tạo Đánh Giá Mới

typescript
const newReview = await client.reviews.create({
  product_id: 'product-123',
  customer_id: 'customer-456',
  order_id: 'order-789',
  rating: 5,
  content: 'Sản phẩm rất tốt, đóng gói cẩn thận',
  images: ['image1.jpg', 'image2.jpg']
});

Phản Hồi Đánh Giá

typescript
const updatedReview = await client.reviews.reply('review-id', 
  'Cảm ơn quý khách đã đánh giá. Chúng tôi rất vui khi sản phẩm đáp ứng được nhu cầu của bạn!'
);

Kiểm Duyệt Đánh Giá

typescript
const moderatedReview = await client.reviews.moderate('review-id', 'approve');

// Hoặc từ chối với lý do
await client.reviews.moderate('review-id', 'reject', 'Nội dung không phù hợp');

Đánh Giá Theo Sản Phẩm

Lấy Tổng Quan Đánh Giá Sản Phẩm

typescript
const summary = await client.reviews.getProductSummary('product-id');

Lấy Đánh Giá Của Sản Phẩm

typescript
const { data: reviews, summary } = await client.reviews.getProductReviews('product-id', {
  page_size: 20,
  page_number: 1
});

Đánh Giá Theo Khách Hàng

typescript
const { data: customerReviews } = await client.reviews.getCustomerReviews('customer-id', {
  page_size: 10,
  page_number: 1
});

Đồng Bộ Đánh Giá Từ Sàn TMĐT

Import Đánh Giá

typescript
const importResult = await client.reviews.importPlatformReviews('shopee', true);
console.log(`Đã import: ${importResult.success_count}/${importResult.total_imported}`);

Đồng Bộ Tự Động

typescript
const syncJob = await client.reviews.syncPlatformReviews('lazada');
console.log(`Job ID: ${syncJob.job_id}, Status: ${syncJob.status}`);

Phân Tích và Thống Kê

Lấy Số Liệu Phân Tích

typescript
const analytics = await client.reviews.getAnalytics({
  from_date: '2024-01-01',
  to_date: '2024-04-30',
  platform: 'shopee'
});

Xuất Báo Cáo

typescript
const exportResult = await client.reviews.export({
  from_date: '2024-04-01',
  to_date: '2024-04-30',
  platform: 'all'
});

Models

Review

typescript
interface Review {
  id: string;
  product_id: string;
  customer_id: string;
  order_id?: string;
  rating: number;
  content?: string;
  images?: string[];
  platform: 'internal' | 'shopee' | 'lazada' | 'tiktok';
  status: 'pending' | 'approved' | 'rejected';
  reply?: string;
  created_at: string;
  updated_at: string;
  customer_info: {
    name: string;
    avatar_url?: string;
  };
  product_info: {
    name: string;
    image_url?: string;
    variation_name?: string;
  };
}

ReviewSummary

typescript
interface ReviewSummary {
  product_id: string;
  total_reviews: number;
  average_rating: number;
  rating_distribution: {
    [key: number]: number;  // key: rating (1-5), value: count
  };
  with_images: number;
  with_content: number;
  platform_distribution: {
    [key: string]: number;  // key: platform name, value: count
  };
}

ReviewAnalytics

typescript
interface ReviewAnalytics {
  total_reviews: number;
  average_rating: number;
  review_distribution: {
    date: string;
    count: number;
    average_rating: number;
  }[];
  top_rated_products: {
    product_id: string;
    product_name: string;
    average_rating: number;
    total_reviews: number;
  }[];
  platform_statistics: {
    platform: string;
    total_reviews: number;
    average_rating: number;
  }[];
}

Ví Dụ Sử Dụng

Quản Lý Đánh Giá Mới

typescript
async function handleNewReviews() {
  try {
    // Lấy danh sách đánh giá chờ duyệt
    const { data: pendingReviews } = await client.reviews.list({
      status: 'pending',
      page_size: 50
    });

    for (const review of pendingReviews) {
      // Kiểm tra nội dung
      if (review.content && containsInappropriateContent(review.content)) {
        await client.reviews.moderate(review.id, 'reject', 'Nội dung không phù hợp');
        continue;
      }

      // Duyệt và phản hồi đánh giá tích cực
      if (review.rating >= 4) {
        await client.reviews.moderate(review.id, 'approve');
        await client.reviews.reply(
          review.id, 
          'Cảm ơn bạn đã dành thời gian đánh giá sản phẩm! Rất vui khi sản phẩm đáp ứng được mong đợi của bạn.'
        );
      }
    }
  } catch (error) {
    console.error('Lỗi khi xử lý đánh giá:', error);
  }
}

function containsInappropriateContent(content: string): boolean {
  // Implement kiểm tra nội dung không phù hợp
  return false;
}

Phân Tích Đánh Giá Theo Sản Phẩm

typescript
async function analyzeProductReviews(productId: string) {
  try {
    // Lấy tổng quan đánh giá
    const summary = await client.reviews.getProductSummary(productId);
    
    // Lấy chi tiết đánh giá
    const { data: reviews } = await client.reviews.getProductReviews(productId, {
      page_size: 100
    });

    // Phân tích điểm đánh giá
    const averageRating = summary.average_rating;
    const totalReviews = summary.total_reviews;
    const imageReviewRate = (summary.with_images / totalReviews) * 100;

    console.log(`
      Tổng quan đánh giá:
      - Điểm trung bình: ${averageRating.toFixed(1)}/5
      - Tổng số đánh giá: ${totalReviews}
      - Tỷ lệ có hình ảnh: ${imageReviewRate.toFixed(1)}%
    `);

    // Phân tích theo nền tảng
    Object.entries(summary.platform_distribution).forEach(([platform, count]) => {
      const percentage = (count / totalReviews) * 100;
      console.log(`${platform}: ${count} đánh giá (${percentage.toFixed(1)}%)`);
    });

  } catch (error) {
    console.error('Lỗi khi phân tích đánh giá:', error);
  }
}