اصلاح جلوگیری قطعی از محصول تکراری ژوپینگ - v4 - 2026-08-23 ================================================================ مدرک خطا در بسته ارسالی: - 36 شناسه ثابت XUPING بیش از یک بار در مقصد ساخته شده‌اند. - نمونه: XUPING_0e52a9863d42c003eccebd1c با IDهای 32997، 32998 و 33099 ساخته شده است. - کد قبلی خطای DNS، timeout یا GET ناموفق را با «محصول وجود ندارد» اشتباه می‌گرفت و POST می‌زد. - کلید نگاشت قبلی به کل URL و CountId وابسته بود؛ تغییر slug یا CountId می‌توانست محصول قبلی را گم کند. رفتار نسخه v4: - هویت منبع از ID عددی داخل URL ژوپینگ ساخته می‌شود و با تغییر slug عوض نمی‌شود. - CountId وقتی ColorId/SizeId وجود دارد از هویت حذف می‌شود. - قبل از هر POST، محصولات مقصد با product_identifier/english_name، نام دقیق و کد عددی یکتای عنوان بررسی می‌شوند. - DNS، timeout، خطای 5xx، index ناقص، نتیجه مبهم و نگاشت 404 همگی fail-closed هستند: محصول جدید ساخته نمی‌شود. - اگر POST ناموفق/نامشخص باشد، همان اجرا هرگز POST دوم نمی‌زند؛ اجرای بعد با فهرست تازه مقصد تطبیق می‌دهد. - اگر فهرست رنگ‌ها موقتاً خالی شود ولی قبلاً رنگ ثبت شده باشد، محصول base جدید ساخته نمی‌شود. - نگاشت‌های قدیمی هنگام پیدا شدن، بدون ساخت محصول به کلید پایدار جدید مهاجرت می‌کنند. نصب ---- ابتدا Cron ژوپینگ را موقتاً Disable کنید و مطمئن شوید اجرای فعالی وجود ندارد: ps -ef | grep '[p]hp .*check_xuping_mixin_sync.php' سپس: cd /home/aminzari/public_html/xuping_mixin_full_bundle cp check_xuping_mixin_sync.php check_xuping_mixin_sync.php.before_v4_20260823 unzip -o xuping_no_duplicate_v4_20260823.zip php -l check_xuping_mixin_sync.php php -l xuping_sync_status.php grep -n XUPING_COMPLETENESS_FIX check_xuping_mixin_sync.php باید no-duplicate-reconcile-v4-2026-08-23 دیده شود. مهم: state.json، sync_map.jsonl، scan_progress.json و کل data_xuping را حذف نکنید. گزارش تکراری‌ها بدون حذف ------------------------- php check_xuping_mixin_sync.php --repair-duplicates این اجرا فقط CSV و JSONL پشتیبان می‌سازد و هیچ محصولی را تغییر نمی‌دهد. خروجی کامل را قبل از مرحله بعد بررسی کنید. حذف خودکار نسخه‌های جدید و نگه‌داشتن قدیمی‌ترین محصول ---------------------------------------------------- فقط بعد از تأیید گزارش Dry-run: php check_xuping_mixin_sync.php --repair-duplicates --apply --confirm=KEEP_OLDEST_DELETE_NEW این حالت برای product_identifier تکراری و همچنین نام دقیقِ دارای کد عددی محصول، کمترین ID را به‌عنوان محصول قدیمی نگه می‌دارد، IDهای جدیدتر را حذف می‌کند و نگاشت‌های ربات را به ID قدیمی وصل می‌کند. نام‌های عمومی بدون کد عددی حذف خودکار نمی‌شوند. قبل از تغییر، از state.json، sync_map.jsonl و اطلاعات محصولات تکراری نسخه پشتیبان ساخته می‌شود. اجرای عادی آزمایشی ----------------- php check_xuping_mixin_sync.php نشانه‌های ایمنی قابل جست‌وجو در cron_trace.log: SAFE_NO_CREATE_MAPPED_LOOKUP_ERROR SAFE_NO_CREATE_ORPHAN_MAPPING SAFE_NO_CREATE_LOOKUP_AMBIGUOUS SAFE_NO_CREATE_RETRY_AFTER_UNCERTAIN_POST REMOTE_EXISTING_RECONCILED SAFE_NO_CREATE_VARIANT_PARSE_EMPTY_PRESERVE_EXISTING