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

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

اپ دوربین تا سبد خرید Jeweltimeco

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

مسئله تجاری

مشاوری که کنار مشتری ایستاده باید قلم را در چند ثانیه در سبد داشته باشد، و آن قلم یک قطعه‌ی فیزیکی مشخص با کد خودش است نه فقط یک مدل. تایپ‌کردن کد کند و خطاپذیر است، و پرسش زیربنایی — آیا همین قطعه هنوز موجود است یا رزرو شده یا قبلاً فاکتور شده — اصلاً از فیلد موجودی ووکامرس قابل جواب‌دادن نیست.

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

  • یک اسکنر در نمای کاتالوگ و برند اپلیکیشن، روی یک دکمه‌ی شناور که با یک دست در دسترس می‌ماند.
  • استفاده از BarcodeDetector بومی جایی که مرورگر فراهمش می‌کند، با فالبک ZXing جایی که نمی‌کند، تا این جریان روی دستگاه‌هایی که تیم واقعاً همراه دارد کار کند.
  • resolve از کد یکتای اسکن‌شده به کد سفارش و محصولش، و سپس افزودن با بررسی رزرو نه یک بررسی خام موجودی.
  • مدیریت صریح وضعیت‌هایی که در یک فروشگاه واقعی پیش می‌آیند: قطعه از قبل به مشتری دیگری تخصیص یافته، کد اسکن‌شده با محصول مورد انتظار تطبیق ندارد، یا موجودی کم است.
  • یک مسیر دستی-بدون-کد برای حالتی که همه‌ی قطعات رزرو شده‌اند و مشاور تأیید می‌کند که با این حال ادامه می‌دهد.
  • یک ابزار ردیابی محصول که یک کد یکتا می‌گیرد و گزارش می‌دهد که موجود، رزروشده یا فاکتورشده است، همراه فاکتور و مشتری مرتبط وقتی مصرف شده باشد.
  • بارگذاری موجودی با CSV یا XLSX کلیدخورده روی کد سفارش و کد یکتا، که کدهای فعال را upsert می‌کند، غایب‌ها را غیرفعال می‌کند و وقتی هیچ کد فعالی نماند محصول را ناموجود علامت می‌زند.

رویکرد فنی

  • حقیقت موجودی در یک جدول کد یکتا زندگی می‌کند نه در فیلد موجودی ووکامرس. همین است که وضعیت رزرو را به یک جواب واقعی تبدیل می‌کند نه یک شمارش.
  • اسکنر تنزل می‌کند نه اینکه یک مرورگر خاص را الزام کند: BarcodeDetector وقتی هست، ZXing وقتی نیست، و مسیر دستی وقتی هیچ‌کدام کمک نمی‌کنند.
  • هر وضعیت شکست نام‌گذاری و جدا مدیریت می‌شود. در یک فروشگاه، اسکنی که بی‌صدا هیچ کاری نمی‌کند بدتر از اسکنی است که می‌گوید این قطعه از قبل روی فاکتور کس دیگری است.
  • بارگذاری‌ها یک گزارش قابل دانلود از کدهای سفارشی که به هیچ محصولی نخوردند تولید می‌کنند، تا یک مشکل ایمپورت قابل‌دیدن باشد نه جذب‌شده.
  • اسکن در مدل نقش به مشاور و بالاتر محدود شده؛ یک نشست مهمان یا مشتری هیچ‌وقت به آن نمی‌رسد.

نتیجه و شواهد

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

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

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

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

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

خلاصه_اجرایی {
  پروژه: "JewelTime Camera-to-Cart"
  پشته: "اندپوینت‌های PHP + SPA جاوااسکریپت خالص، PWA"
  اسکنر: "BarcodeDetector، فالبک ZXing، مسیر دستی"
  resolve: "کد یکتا ← کد سفارش ← محصول"
  حقیقت: "جدول موجودی کد یکتا، نه فیلد موجودی ووکامرس"
  وضعیت‌ها: "از قبل تخصیص‌یافته، ناهماهنگی محصول، موجودی کم،
             کاملاً رزروشده (بازنویسی دستی با تأیید)"
  ردیابی: "کد یکتا ← موجود / رزروشده / فاکتورشده،
           همراه فاکتور و مشتری مرتبط"
  ورود_داده: "upsert با CSV/XLSX، غیرفعال‌کردن کدهای غایب،
              گزارش کدهای سفارش بی‌تطبیق"
  دسترسی: "نقش مشاور فروش و بالاتر"
}

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

بخش جالب اسکنر نیست، چیزی است که اسکن در برابرش resolve می‌شود. اول ساختن جدول موجودی کد یکتا همان چیزی است که یک فیچر دوربین را ارزشمند کرد.

برشمردن صریح وضعیت‌های شکست — تخصیص‌یافته، ناهماهنگ، کم، کاملاً رزروشده — تفاوت بین دمویی است که اسکن می‌کند و ابزاری که یک فروشگاه می‌تواند در یک روز شلوغ بگرداند.