← بازگشت به لیست مقالات

مدیریت محصولات و موجودی در ربات بله (همگام‌سازی با وب‌سایت)

مدیریت محصولات ربات بله نباید دستی باشد. با همگام‌سازی، موجودی همیشه به‌روز می‌ماند.

تصور کنید مشتری در ربات بله محصولی را می‌خرد، اما موجودی انبار صفر است. یا بدتر، مجبور باشید هر روز محصولات را در دو جا (سایت و ربات) جداگانه آپدیت کنید. این کابوس هر فروشنده‌ای است. راه حل چیست؟ یک سیستم مدیریت محصولات و موجودی یکپارچه. در این مقاله از مجموعه راهنمای جامع ربات بله، به شما نشان می‌دهم چطور با PHP یک پنل مدیریت حرفه‌ای داخل ربات بله بسازید و موجودی را با وب‌سایت همگام کنید. این دقیقاً سیستمی است که در پروژه کلینیک دکتر رضوانی پیاده کردیم و حالا با یک کلیک، انبار سایت و ربات هماهنگ می‌شوند.

۱. معماری سیستم مدیریت محصولات

برای یک سیستم حرفه‌ای، محصولات باید در یک دیتابیس متمرکز ذخیره شوند. چه ربات بله فروش را انجام دهد، چه وب‌سایت، هر دو از یک منبع می‌خوانند. ساختار پیشنهادی جدول `products` به این صورت است:

CREATE TABLE products (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    category VARCHAR(50),
    price INT NOT NULL,
    stock INT DEFAULT 0,
    description TEXT,
    image_url VARCHAR(500),
    is_active TINYINT(1) DEFAULT 1,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
                

فیلد `stock` (موجودی) مهمترین بخش است. هر بار که فروشی در ربات یا سایت انجام می‌شود، این عدد یک واحد کم می‌شود.

۲. ساخت پنل مدیریت داخل ربات بله

به جای یک پنل تحت وب پیچیده، می‌توانید یک پنل مدیریت ساده داخل خود ربات برای ادمین بسازید. این پنل با Inline Keyboard که در سرباز قبلی یاد گرفتید، پیاده‌سازی می‌شود.

منوی اصلی ادمین

<?php
function sendAdminPanel($chat_id) {
    $keyboard = [
        'inline_keyboard' => [
            [['text' => '➕ افزودن محصول', 'callback_data' => 'admin_add_product']],
            [['text' => '📋 لیست محصولات', 'callback_data' => 'admin_list_products']],
            [['text' => '🔄 همگام‌سازی با سایت', 'callback_data' => 'admin_sync_stock']]
        ]
    ];
    sendMessage($chat_id, "پنل مدیریت:", json_encode($keyboard));
}
?>
                

افزودن محصول جدید (مکالمه مرحله‌ای)

برای افزودن محصول، از State Machine استفاده می‌کنیم. کاربر وارد حالت «افزودن محصول» می‌شود و ربات قدم‌به‌قدم نام، قیمت و موجودی را می‌پرسد:

<?php
function handleAdminCallback($chat_id, $data) {
    switch ($data) {
        case 'admin_add_product':
            setState($chat_id, 'adding_product_name');
            sendMessage($chat_id, "نام محصول را وارد کنید:");
            break;
        // ...
    }
}

function handleAdminMessage($chat_id, $text) {
    $state = getState($chat_id);
    if ($state === 'adding_product_name') {
        saveTempData($chat_id, 'name', $text);
        setState($chat_id, 'adding_product_price');
        sendMessage($chat_id, "قیمت (تومان) را وارد کنید:");
    } elseif ($state === 'adding_product_price') {
        saveTempData($chat_id, 'price', intval($text));
        setState($chat_id, 'adding_product_stock');
        sendMessage($chat_id, "موجودی اولیه را وارد کنید:");
    } elseif ($state === 'adding_product_stock') {
        $data = getTempData($chat_id);
        addProductToDB($data['name'], $data['price'], intval($text));
        clearState($chat_id);
        sendMessage($chat_id, "✅ محصول با موفقیت اضافه شد.");
        sendAdminPanel($chat_id);
    }
}
?>
                

با این روش، حتی بدون دانش فنی هم می‌توان از داخل بله محصولات را مدیریت کرد.

۳. نمایش محصولات با موجودی زنده در ربات

وقتی کاربر در فروشگاه محصولات را می‌بیند، باید موجودی واقعی نشان داده شود. همچنین اگر موجودی صفر است، دکمه خرید غیرفعال شود:

<?php
function showProductsWithStock($chat_id, $category) {
    $stmt = $pdo->prepare("SELECT * FROM products WHERE category = ? AND is_active = 1");
    $stmt->execute([$category]);
    $products = $stmt->fetchAll();

    $keyboard = ['inline_keyboard' => []];
    foreach ($products as $p) {
        $stock_text = $p['stock'] > 0 ? "✅ موجود" : "❌ ناموجود";
        $text = $p['name'] . " - " . number_format($p['price']) . " تومان ($stock_text)";
        $callback = $p['stock'] > 0 ? 'buy_' . $p['id'] : 'outofstock';
        $keyboard['inline_keyboard'][] = [['text' => $text, 'callback_data' => $callback]];
    }
    $keyboard['inline_keyboard'][] = [['text' => '🔙 بازگشت', 'callback_data' => 'main_menu']];
    sendMessage($chat_id, "محصولات:", json_encode($keyboard));
}
?>
                

اگر `callback_data` برابر `outofstock` باشد، ربات یک پیام «این محصول در حال حاضر موجود نیست» نمایش می‌دهد.

۴. همگام‌سازی موجودی با وب‌سایت (API)

اگر وب‌سایت و ربات از یک دیتابیس استفاده کنند، مشکل حل است. اما اگر جدا هستند، یک API ساده روی وب‌سایت پیاده‌سازی کنید که ربات بتواند موجودی را از آن بخواند یا به‌روزرسانی کند.

ارسال موجودی از ربات به وب‌سایت

<?php
// در ربات بله، بعد از فروش موفق
function updateWebsiteStock($product_id, $new_stock) {
    $api_url = "https://yourwebsite.com/api/update-stock.php";
    $data = ['product_id' => $product_id, 'stock' => $new_stock, 'secret_key' => 'YOUR_SECRET'];
    $ch = curl_init($api_url);
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
    curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $response = curl_exec($ch);
    curl_close($ch);
}
?>
                

در سمت وب‌سایت، فایل `update-stock.php` دیتابیس را آپدیت می‌کند. برای امنیت، از یک `secret_key` استفاده کنید که فقط ربات و سایت می‌دانند.

۵. مدیریت سفارش‌ها و کاهش خودکار موجودی

پس از تأیید پرداخت در اتصال به زرین‌پال، باید موجودی را کم کنید:

<?php
// پس از verify موفق در callback زرین‌پال
$stmt = $pdo->prepare("UPDATE products SET stock = stock - ? WHERE id = ? AND stock >= ?");
$stmt->execute([$quantity, $product_id, $quantity]);

if ($stmt->rowCount() > 0) {
    // کاهش موفق
    $new_stock = $pdo->query("SELECT stock FROM products WHERE id = $product_id")->fetchColumn();
    updateWebsiteStock($product_id, $new_stock); // همگام‌سازی با سایت
} else {
    // موجودی کافی نبوده - باید سفارش را ریفاند کنید
}
?>
                

۶. سوالات متداول

آیا می‌توانم محصولات را با اکسل در ربات آپلود کنم؟

بله، می‌توانید یک فایل CSV در پنل ادمین ربات آپلود کنید و با PHP آن را پردازش کنید. حتی می‌توانیم برایتان یک ماژول اختصاصی بسازیم. تماس بگیرید.

اگر وب‌سایت و ربات دیتابیس جدا داشته باشند، کدام یک منبع اصلی است؟

توصیه می‌کنیم وب‌سایت را به عنوان منبع اصلی (Source of Truth) در نظر بگیرید و ربات از API آن برای خواندن و نوشتن موجودی استفاده کند.

چطور می‌توانم موجودی را در لحظه به کاربر نشان دهم؟

با هر بار باز شدن صفحه محصول، یک کوئری سریع به دیتابیس بزنید. برای کاهش بار، می‌توانید از کش (Redis) استفاده کنید و پس از هر فروش، کش را invalidate کنید.

آیا ربات می‌تواند هشدار موجودی کم بدهد؟

بله، یک CRON job در سرور تنظیم کنید که روزانه موجودی‌ها را چک کند و اگر محصولی زیر حد نصاب (مثلاً ۵ عدد) بود، به ادمین پیام دهد.

آیا شهبازیون می‌تواند این سیستم را برای من پیاده‌سازی کند؟

قطعاً. ما در خانه ربات و وب سیستم‌های مدیریت محصولات و همگام‌سازی را برای پروژه‌هایی مثل کلینیک دکتر رضوانی انجام داده‌ایم. برای مشاوره، فرم درخواست را پر کنید.

مدیریت محصولات و موجودی در ربات بله (همگام‌سازی با وب‌سایت)

تصویر مرتبط با مقاله "مدیریت محصولات و موجودی در ربات بله (همگام‌سازی با وب‌سایت)"

💬 نظرات کاربران

هنوز نظری ثبت نشده است. اولین نفری باشید که نظر می‌دهید!