Amirali Yaghoutiمهندس ارشد نرم‌افزار

مطالعه موردی مهندسی

سایت‌های کاتالوگ برند

یک پخش‌کنندهٔ ساعت با شبکهٔ نمایندگی، برندهایی را نمایندگی می‌کند که هرکدام ویترین خودشان را می‌خواهند؛ اما یک دیتابیس محصول بیشتر نیست و یک تیم آن را درست نگه می‌دارد. چهار سایت کاتالوگ برند ساختم که همان دیتابیس را می‌خوانند و هرگز در آن نمی‌نویسند، و کنارشان سه ابزار سمت نمایندگی‌ها: جریان تأیید فروشندهٔ آنلاین، منوی برندی که فقط چیزی را ادعا می‌کند که بتواند ثابت کند، و رصد قیمتِ خودِ نمایندگی‌ها.

مسئله تجاری

پخش‌کننده از قبل دو سایت خواهر روی یک دیتابیس محصول داشت: یک فروشگاه WooCommerce و یک اپ کاتالوگ و سفارش‌گیری با PHP خالص برای نمایندگی‌ها، با داشبوردهای نقش‌محور. هر برند هنوز سایت خودش را می‌خواست، فارسی‌اول و با متن واقعی؛ ولی یک نسخهٔ دوم از کاتالوگ، فردای راه‌اندازی از اصل فاصله می‌گرفت. سایت‌های برند باید دادهٔ مرکزی را می‌خواندند و از سر راهش کنار می‌ماندند.

سمت نمایندگی‌ها هم شکاف‌های خودش را داشت. هر نمایندگی می‌توانست ادعا کند آنلاین می‌فروشد و کسی بررسی نمی‌کرد. منوی برندهای فروشگاه، برندها را از روی یک ویژگی محصول به کشورها گروه‌بندی می‌کرد و دادهٔ کم، برندهای کاملی را زیر پرچم اشتباه گذاشته بود. و هیچ‌کس اندازه نمی‌گرفت نمایندگی‌ها واقعاً چه قیمتی می‌زنند، در برابر قیمت مرجع خودِ پخش‌کننده.

آنچه تحویل دادم

  • چهار سایت کاتالوگ برند فارسی‌اول، به‌صورت یک اپ PHP خالص که دیتابیس WooCommerce پخش‌کننده را فقط‌خواندنی می‌خواند، با نسخهٔ انگلیسی و hreflang. هم‌پوشانی بین برندها صفر است: هر محصول دقیقاً به سایت یک برند تعلق دارد.
  • متن اصیل در همه‌جا. توضیحات همهٔ محصول‌های مبدأ خالی بود، پس هیچ‌چیز روی سایت‌های برند تکرار فروشگاه مرکزی نیست. ۲٬۳۳۸ تصویر یکتا، ۱۹۳ مگابایت، همه WebP.
  • خرید روی سایت‌های برند: سبد نشستی، فرم پرداخت فارسی با اعتبارسنجی، و ثبت سفارش در دیتابیس خودِ حساب برند. پرداخت پشت یک واسط درگاه نشسته که سفارش را ثبت می‌کند و قول callback می‌دهد، تا وقتی مالک بانک را مشخص کند.
  • جریان فروشندهٔ آنلاین در اپ نمایندگی‌ها: نمایندگی هنگام ثبت‌نام تیک «سایت دارم» را می‌زند، مشاورش تأیید یا رد می‌کند، و نمایندگی‌های تأییدشده دو دانلود Excel می‌گیرند. هر اعطا، لغو و دانلود ثبت می‌شود.
  • منوی برندها گروه‌بندی‌شده به کشور از روی یک نقشهٔ دست‌ساز: ۱۷ گروه کشوری، و ۲۲ برند عمداً در «سایر برندها» مانده‌اند، چون حدس اشتباه از بی‌برچسبی بدتر است.
  • رصد بازار با دو مخاطب از یک جمع‌کننده: نمای رقبا که فروشگاه‌های رقیب را با کاتالوگ مقایسه می‌کند، و نمای بازرسی نمایندگی‌ها فقط برای مدیر، که سایت‌های خود فروشندگان را در برابر کاتالوگ نُه‌برندی پخش‌کننده بررسی می‌کند. تاریخچه در یک انبار فشردهٔ SQLite از سطرهای وضعیت و تغییر می‌نشیند.

رویکرد فنی

  • فقط‌خواندنی از پایه. سایت‌های برند هرگز در دیتابیس مرکزی نمی‌نویسند؛ سفارش‌ها در دیتابیس خودِ هر حساب برند می‌نشینند و ثبت سفارش، موجودی مرکزی را کم نمی‌کند. تطبیق دستی است، و همین را می‌گویم، نه اینکه وانمود کنم دو طرف همگام‌اند.
  • برچسب برند شاهد می‌خواهد. نسخهٔ قبلی که از ویژگی محصول می‌آمد ۵۸ دستهٔ سوئیسی، ۵۶ ژاپنی و یک چینی ساخته بود، و یک محصولِ برچسب‌خورده از ۶۵۳ محصول، کل یک برند را زیر سوئیس برده بود. قاعدهٔ شاهد حالا نصف محصول‌ها را می‌خواهد، یا دست‌کم پنج محصول برچسب‌خورده با ۹۰٪ توافق؛ و منوی زنده کشورِ هر برند را از یک نقشهٔ دست‌ساز می‌گیرد. دو کش هر تغییری را پنهان می‌کنند، گزینهٔ نقشه که روزانه بازسازی می‌شود و کش منوی ناوبری، پس هر دو با هم پاک می‌شوند.
  • فقط جایی مقایسه کن که هر دو طرف موجودی دارند. در رصد قیمت، ۵۵ تا از ۷۰ قلم «گران‌تر» صرفاً سمت ما ناموجود بودند و میانگین را به +۱۳۹٪ رسانده بودند، در برابر +۱۸٪ برای موارد واقعی. هر طرف جداگانه میانگین گرفته می‌شود، نام برندها یکدست می‌شود، و واحد پول از نسبت میانه تشخیص داده می‌شود؛ چون یک سایت ریال منتشر می‌کند و +۹۰۰٪ خوانده می‌شد.
  • رصد سایت فروشندگان ساعت ۱۰ و ۱۸ اجرا می‌شود، محصول‌های JSON-LD را می‌خواند و با SKU یا slug آدرس تطبیق می‌دهد؛ در مقایسهٔ قیمت ×۱، ÷۱۰ و ×۱۰ را می‌پذیرد، چون فروشگاه‌های دیگر عدد ضرب‌شده را منتشر می‌کنند. اول روی کاتالوگ خودِ پخش‌کننده اعتبارسنجی‌اش کردم: ۱۰ صفحه خزیده شد، ۹ تا تطبیق خورد، همهٔ قیمت‌ها و موجودی‌ها درست.
  • مشاورها در اپ شناسهٔ Telegram ندارند، پس هشدار فروشندگان به شکل اعلان درون‌اپ به‌علاوهٔ web push می‌رسد. حذف یک برند یک عملیات است: محصول‌هایش در دیتابیس مشترک ناموجود می‌شوند و از فهرست برندهای اپ برداشته می‌شود.

نتیجه و شواهد

دو تا از چهار سایت برند از مرداد زنده‌اند. سومی ساخته شده و منتظر واگذاری DNS است؛ دامنهٔ چهارمی در آخرین بررسی هنوز ثبت نشده بود و زیر یک زیردامنهٔ staging اجرا می‌شود. جریان فروشندهٔ آنلاین شهریور زنده شد، با ۹۴ حساب نمایندگی در آن زمان و هنوز هیچ‌کدام تأییدشده به‌عنوان فروشندهٔ آنلاین؛ پس دانلودهای Excel هنوز به دست فروشندهٔ واقعی نرسیده‌اند. منوی کشوری از شهریور با ۱۷ گروه و ۲۲ برند در «سایر برندها» زنده است. رصد بازار شهریور ساخته شد: روز اول ۷٬۱۶۶ قلم را در ۲٫۲ مگابایت نگه داشت، به‌جای JSON روزانهٔ حدود ۰٫۵ مگابایت به‌ازای هر سایت، و یک اسکن دوباره از ۱٬۸۶۸ سطر فقط ۲۷ تغییر نوشت.

اهمیت برای کارفرما

پخش‌کننده‌ای که برند نمایندگی می‌کند، باید هر برند آنلاین شبیه خودش باشد، بی‌آنکه کاتالوگ به نسخه‌هایی تقسیم شود که از هم فاصله می‌گیرند. خواندن فقط‌خواندنیِ یک دیتابیس دقیقاً همین را می‌دهد، و ابزار نمایندگی‌ها از حاشیهٔ سودی محافظت می‌کند که برندها به آن تکیه دارند: فقط فروشندهٔ تأییدشده دادهٔ تجاری را می‌بیند، منو هیچ برندی را اشتباه برچسب نمی‌زند، و نمایندگی‌ای که زیر قیمت مرجع می‌فروشد روی یک کارت دیده می‌شود، نه در یک شکایت.

خلاصه-اجرایی-پروژه

خلاصه اجرایی خوانا

خلاصه_اجرایی {
  پروژه: "Brand Catalogue Sites"
  وضعیت: "دو سایت زنده؛ سومی ساخته و منتظر واگذاری DNS؛
          چهارمی روی زیردامنهٔ staging، دامنه ثبت‌نشده"
  منبع: "یک دیتابیس محصول WooCommerce، فقط‌خواندنی؛ هم‌پوشانی
         صفر بین برندها؛ توضیحات همهٔ محصول‌های مبدأ خالی بود"
  خرید: "سبد نشستی، پرداخت فارسی با اعتبارسنجی، سفارش در دیتابیس
         خودِ حساب برند؛ موجودی مرکزی دست‌نخورده"
  فروشندگان: "تیک «سایت دارم» در ثبت‌نام -> تأیید مشاور ->
              دو دانلود Excel؛ هر اعطا، لغو و دانلود ثبت می‌شود"
  منوی_برند: "نقشهٔ کشوری دست‌ساز، ۱۷ گروه؛ ۲۲ برند به‌جای حدس
              در «سایر برندها» مانده‌اند"
  رصد_بازار: "یک جمع‌کننده؛ نمای رقبا + بازرسی نمایندگی فقط برای
              مدیر؛ سطرهای وضعیت و تغییر در SQLite"
  دقت: "فقط جایی مقایسه کن که هر دو طرف موجودی دارند؛ واحد پول
        از نسبت میانه تشخیص داده می‌شود"
}

ارزش حرفه‌ای این پروژه

سطل «سایر برندها» تصمیمی است که دوست دارم بازبین به آن توجه کند. بیست‌ودو برند بی‌برچسب آنجا نشسته‌اند، چون داده نمی‌توانست ثابت کند از کجا آمده‌اند، و پرچم اشتباه روی صفحهٔ یک برند از بی‌پرچمی بدتر است.

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