מערכת קנייה קבוצתית ל-1C-Bitrix: הנחות דינמיות

כאשר אתה זקוק למערכת קנייה קבוצתית ל-1C-Bitrix, מערכת הקנייה הקבוצתית שלנו מטפלת בהנחות קבוצתיות דינמיות שהנחות רגילות אינן יכולות. ה-Bitrix המקומי אינו יכול לקשר הנחה למספר המשתתפים: מודול ה-`sale` פועל עם הזמנות בודדות, ו-`b_catalog_discount` הוא סטטי.
השירותים שאנו מציעים
מציג 1 מתוך 1כל 1626 השירותים
מערכת קנייה קבוצתית ל-1C-Bitrix: הנחות דינמיות
בינוני
~1-2 שבועות

הכישורים שלנו:

שאלות נפוצות

העבודות האחרונות

  • פיתוח אתר חברה B2B ADVANCE
    פיתוח אתר חברה B2B ADVANCE
    1460
  • פיתוח אתר לחברת FIXPER
    פיתוח אתר לחברת FIXPER
    1019
  • פיתוח מבוסס Bitrix, Bitrix24, 1C לחברה פיתוח ווידג'ט להזמנת תורים אונליין למרכז רפואי
    פיתוח מבוסס Bitrix, Bitrix24, 1C לחברה פיתוח ווידג'ט להזמנת תורים אונליין למרכז רפואי
    764
  • פיתוח על בסיס 1C Enterprise עבור MIRSANBEL
    פיתוח על בסיס 1C Enterprise עבור MIRSANBEL
    882
  • פיתוח אתר על CRM Bitrix24 עבור DOLBIMBY
    פיתוח אתר על CRM Bitrix24 עבור DOLBIMBY
    809
  • פיתוח על בסיס Bitrix24 עבור חברת TECHNOTORGKOMPLEKS
    פיתוח על בסיס Bitrix24 עבור חברת TECHNOTORGKOMPLEKS
    1165

כאשר אתם זקוקים למערכת רכישה קבוצתית עבור 1C-Bitrix, מערכת הרכישה הקבוצתית שלנו מטפלת בהנחות קבוצתיות דינמיות שהנחות רגילות לא יכולות לספק. ה-Bitrix המקומי לא יכול לקשר הנחה למספר המשתתפים: המודול sale פועל עם הזמנות בודדות, ו-b_catalog_discount הוא סטטי. אנו בונים את כל הלוגיקה על גבי הארכיטקטורה הסטנדרטית, תוך שימוש בטבלאות ועסקאות מותאמות אישית. מקרה טיפוסי: חנות מקוונת מריצה מבצע "ככל שיותר קונים, המחיר נמוך יותר." ללא התאמה אישית, כל משתתף חדש מבצע הזמנה באותו מחיר. אנו מוסיפים מערכת שמחשבת מחדש את העלות באופן דינמי ומסנכרנת את מונה המשתתפים בזמן אמת. לצוות שלנו יש ניסיון של 10+ שנים בפיתוח 1C-Bitrix ועשרות פרויקטים מוצלחים. אנו מכירים את כל המלכודות ומוכנים ליישם את המערכת במפתח מלא תוך 1–5 שבועות. קונים יכולים לחסוך עד 40% ברכישות קבוצתיות, וחנויות מגדילות את ערך ההזמנה הממוצע ב-25%. שיפור טיפוסי בשיעור ההמרה: 30-50% בעסקאות קבוצתיות. מערכת דינמית זו יעילה פי 2 מהנחות סטטיות ומהירה פי 3 ליישום מפתרונות מותאמים אישית.

איך זה עובד

  1. חנות יוצרת עסקה קבוצתית למוצר עם רמות הנחה.
  2. משתתפים מצטרפים ומשלמים מראש או מזמינים מקום.
  3. כאשר מצטרפים מספיק משתתפים, העסקה מופעלת וכולם מקבלים את המחיר המוזל.
  4. אם העסקה נכשלת, ההחזרים מעובדים אוטומטית.

כיצד אנו מגנים מפני תנאי מרוץ?

האתגר ההנדסי המרכזי הוא הצטרפות בו-זמנית של משתתפים. אם שני לקוחות קוראים את CREATE TABLE b_group_deal ( ID INT AUTO_INCREMENT PRIMARY KEY, PRODUCT_ID INT NOT NULL, DATE_START DATETIME NOT NULL, DATE_END DATETIME NOT NULL, MIN_PARTICIPANTS INT NOT NULL, MAX_PARTICIPANTS INT, CURRENT_COUNT INT DEFAULT 0, STATUS ENUM('active','success','failed','closed') DEFAULT 'active', INDEX idx_product (PRODUCT_ID), INDEX idx_status_date (STATUS, DATE_END) ); CREATE TABLE b_group_deal_tier ( ID INT AUTO_INCREMENT PRIMARY KEY, DEAL_ID INT NOT NULL, PARTICIPANTS_FROM INT NOT NULL, DISCOUNT_PERCENT DECIMAL(5,2), PRICE_FIXED DECIMAL(10,2), FOREIGN KEY (DEAL_ID) REFERENCES b_group_deal(ID) ); CREATE TABLE b_group_deal_participant ( ID INT AUTO_INCREMENT PRIMARY KEY, DEAL_ID INT NOT NULL, USER_ID INT NOT NULL, ORDER_ID INT, DATE_ADD DATETIME NOT NULL, STATUS ENUM('waiting','paid','cancelled','refunded') ); עם CURRENT_COUNT, שניהם עלולים להפוך למשתתף ה"מפעיל". ההגנה היא עדכון אטומי:

CREATE TABLE b_group_deal ( ID INT AUTO_INCREMENT PRIMARY KEY, PRODUCT_ID INT NOT NULL, DATE_START DATETIME NOT NULL, DATE_END DATETIME NOT NULL, MIN_PARTICIPANTS INT NOT NULL, MAX_PARTICIPANTS INT, CURRENT_COUNT INT DEFAULT 0, STATUS ENUM('active','success','failed','closed') DEFAULT 'active', INDEX idx_product (PRODUCT_ID), INDEX idx_status_date (STATUS, DATE_END) ); CREATE TABLE b_group_deal_tier ( ID INT AUTO_INCREMENT PRIMARY KEY, DEAL_ID INT NOT NULL, PARTICIPANTS_FROM INT NOT NULL, DISCOUNT_PERCENT DECIMAL(5,2), PRICE_FIXED DECIMAL(10,2), FOREIGN KEY (DEAL_ID) REFERENCES b_group_deal(ID) ); CREATE TABLE b_group_deal_participant ( ID INT AUTO_INCREMENT PRIMARY KEY, DEAL_ID INT NOT NULL, USER_ID INT NOT NULL, ORDER_ID INT, DATE_ADD DATETIME NOT NULL, STATUS ENUM('waiting','paid','cancelled','refunded') ); 

לאחר ההצטרפות, המשתתף מקבל את הסטטוס paid. התשלום מתרחש בשני תרחישים:

תרחיש א' — תשלום מראש: המשתתף מבצע הזמנה מידית ומשלם. אם העסקה לא מגיעה ל-CURRENT_COUNT = 9 עד MIN_PARTICIPANTS = 10, הכסף מוחזר אוטומטית באמצעות מטפל סוכן.

תרחיש ב' — הזמנה דחויה: המשתתף מזמין מקום ללא תשלום. כאשר המינימום מושג, כל המשתתפים מקבלים הודעה עם הצעה לבצע הזמנה במחיר המוזל. המועד האחרון הוא 24–48 שעות.

השוואת תרחישים:

תרחיש תשלום סיכון לקונה סיכון לחנות
תשלום מראש מיידי כסף קפוא עד להשלמת העסקה החזרים אם העסקה נכשלת
הזמנה דחויה לאחר השגת הסף אין סיכון, אך יש צורך לעקוב אחר ההודעות חלק מהמשתתפים עלולים לא לבצע הזמנה

תמחור והנחות

ההנחה הנוכחית מחושבת דינמית מטבלת use Bitrix\Main\Application; $connection = Application::getConnection(); $connection->startTransaction(); try { $row = $connection->query( "SELECT * FROM b_group_deal WHERE ID = {$dealId} AND STATUS = 'active' FOR UPDATE" )->fetch(); if (!$row || strtotime($row['DATE_END']) < time()) { $connection->rollbackTransaction(); return ['error' => 'Deal not available']; } $connection->query( "INSERT INTO b_group_deal_participant (DEAL_ID, USER_ID, DATE_ADD, STATUS) VALUES ({$dealId}, {$userId}, NOW(), 'waiting')" ); $connection->query( "UPDATE b_group_deal SET CURRENT_COUNT = CURRENT_COUNT + 1 WHERE ID = {$dealId}" ); $connection->commitTransaction(); } catch (\Exception $e) { $connection->rollbackTransaction(); throw $e; } . לא ניתן להשתמש במערכת ההנחות הסטנדרטית waiting — היא לא עובדת עם מונה דינמי. חישוב הרמה הפעילה:

use Bitrix\Main\Application; $connection = Application::getConnection(); $connection->startTransaction(); try { $row = $connection->query( "SELECT * FROM b_group_deal WHERE ID = {$dealId} AND STATUS = 'active' FOR UPDATE" )->fetch(); if (!$row || strtotime($row['DATE_END']) < time()) { $connection->rollbackTransaction(); return ['error' => 'Deal not available']; } $connection->query( "INSERT INTO b_group_deal_participant (DEAL_ID, USER_ID, DATE_ADD, STATUS) VALUES ({$dealId}, {$userId}, NOW(), 'waiting')" ); $connection->query( "UPDATE b_group_deal SET CURRENT_COUNT = CURRENT_COUNT + 1 WHERE ID = {$dealId}" ); $connection->commitTransaction(); } catch (\Exception $e) { $connection->rollbackTransaction(); throw $e; } 

בעת הוספה לסל, המחיר מוחלף באמצעות מטפל MIN_PARTICIPANTS.

סרגל התקדמות ויזואלי

רכיב ההתקדמות הוא ווידג'ט AJAX שמתעדכן כל 30 שניות. הנתונים מסופקים על ידי הבקר:

function getActiveTier(int $dealId, int $currentCount): ?array { $connection = Application::getConnection(); return $connection->query( "SELECT * FROM b_group_deal_tier WHERE DEAL_ID = {$dealId} AND PARTICIPANTS_FROM <= {$currentCount} ORDER BY PARTICIPANTS_FROM DESC LIMIT 1" )->fetch() ?: null; } 

סרגל ההתקדמות מציג את האחוז DATE_END ומראה כמה משתתפים נדרשים עד לרמת ההנחה הבאה.

כיצד עסקאות מושלמות והחזרים מעובדים?

ה-b_group_deal_tier רץ כל 5 דקות (ראה תיעוד Bitrix) ובודק עסקאות עם b_catalog_discount שפג תוקפן:

  • אם function getActiveTier(int $dealId, int $currentCount): ?array { $connection = Application::getConnection(); return $connection->query( "SELECT * FROM b_group_deal_tier WHERE DEAL_ID = {$dealId} AND PARTICIPANTS_FROM <= {$currentCount} ORDER BY PARTICIPANTS_FROM DESC LIMIT 1" )->fetch() ?: null; } → סטטוס OnSaleBasketItemRefreshData. משתתפים עם // /local/ajax/group-deal-status.php $deal = $connection->query( "SELECT gd.*, gt.DISCOUNT_PERCENT, gt.PARTICIPANTS_FROM as NEXT_TIER FROM b_group_deal gd LEFT JOIN b_group_deal_tier gt ON gt.DEAL_ID = gd.ID AND gt.PARTICIPANTS_FROM > gd.CURRENT_COUNT WHERE gd.ID = {$dealId} ORDER BY gt.PARTICIPANTS_FROM ASC LIMIT 1" )->fetch(); header('Content-Type: application/json'); echo json_encode([ 'current' => (int)$deal['CURRENT_COUNT'], 'next_tier' => (int)$deal['NEXT_TIER'], 'discount' => (float)$deal['DISCOUNT_PERCENT'], 'time_left' => strtotime($deal['DATE_END']) - time(), ]); מקבלים משימה לבצע הזמנה.
  • אם current / next_tier * 100 → סטטוס CAgent. עבור משתתפים עם DATE_END, מתבצע החזר באמצעות CURRENT_COUNT >= MIN_PARTICIPANTS.

הודעות נשלחות דרך success עם תבניות מותאמות אישית.

מה כלול

  • ניתוח דרישות ועיצוב סכמת נתונים
  • יישום טבלאות מותאמות אישית ומודלי ORM
  • הגדרת סוכנים ותבניות דואר
  • אינטגרציה עם מערכות תשלום (54-FZ, מפעיל נתונים פיסקליים)
  • בדיקות תחת עומס תחרותי
  • תיעוד והדרכת מנהלים
  • תמיכה באחריות לאחר ההשקה

לוח זמנים ליישום

היקף תכונות מסגרת זמן
MVP (עסקה אחת, רמת הנחה אחת, ניהול ידני) בלוק HL + מטפלים + מונה AJAX 1–1.5 שבועות
מערכת מלאה (רמות, סוכנים, החזרים, חשבון משתתף) טבלאות מותאמות אישית + עסקאות + מודול + תבניות דואר 2–3 שבועות
שוק עסקאות (ספקים מרובים, ויטרינה) מודול מלא עם ממשק ניהול + API 4–5 שבועות

בדיקות עומס ואבטחה

לפני השקת מערכת הרכישה הקבוצתית, יש צורך לבדוק את התרחיש המקבילי: כמה עשרות הצטרפויות בו-זמנית לעסקה אחת. ללא זה, תנאי המרוץ מתגלה רק תחת תעבורה אמיתית, כאשר waiting עולה על CURRENT_COUNT < MIN_PARTICIPANTS.

בדיקה: באמצעות Apache JMeter או k6, הדמו 50 בקשות בו-זמנית לנקודת ההצטרפות. התוצאה הצפויה היא בדיוק failed רשומות ב-paid עם סטטוס \Bitrix\Sale\PaySystem\Manager::refund(). אם יש יותר רשומות, העסקאות לא פועלות כראוי. בדקו את רמת הבידוד של MySQL (\Bitrix\Main\Mail\Event::send()) ואת נוכחות נעילת MAX_PARTICIPANTS בשאילתת בחירת העסקה. בעת שימוש ב-MariaDB, ודאו בנוסף שמצב עסקאות קפדני מופעל (b_group_deal_participant).

בנוסף: הוסיפו הגבלת קצב על נקודת ההצטרפות — לא יותר מ-3 בקשות מכתובת IP אחת בשנייה. זה מגן מפני בוטים שעלולים למלא את העסקה במשתתפים מזויפים.

צרו קשר כדי להעריך את הפרויקט שלכם. קבלו ייעוץ ליישום מערכת רכישה קבוצתית.