تم الشحن
تم التوصيل
تم الطباعة
بدء الكاميرا
مسح
تأكيد وتغيير الحالة
عدد المسجل: 0 ✅
// ✅ حط هنا لينك Google Web App بتاعك const WEB_APP_URL = "PUT_YOUR_WEB_APP_URL_HERE"; const video = document.getElementById('video'); const startBtn = document.getElementById('start'); const clearBtn = document.getElementById('clear'); const sendBtn = document.getElementById('send'); const statusEl = document.getElementById('status'); const listEl = document.getElementById('list'); const countEl = document.getElementById('count'); const beep = document.getElementById('beep'); const scanned = new Set(); let stream = null; let scanning = false; // Canvas مخفي لقراءة الفريم const canvas = document.createElement('canvas'); const ctx = canvas.getContext('2d'); function renderList(){ countEl.textContent = scanned.size; listEl.innerHTML = Array.from(scanned).map(id => `<div style="padding:6px 8px;border-bottom:1px solid #eee">${id}</div>` ).join('') || '<div style="color:#777">مفيش حاجة اتسجلت لسه…</div>'; } function tryExtractOrderId(text){ // يقبل QR فيها رقم فقط أو "Order: 1234" أو URL فيها orderId=... const s = String(text || '').trim(); const m1 = s.match(/\border\s*[:#]?\s*(\d+)/i); if (m1) return m1[1]; const m2 = s.match(/[?&]orderId=(\d+)/i); if (m2) return m2[1]; const m3 = s.match(/\b(\d{3,})\b/); return m3 ? m3[1] : null; } async function startCamera(){ try{ stream = await navigator.mediaDevices.getUserMedia({ video: { facingMode: "environment" }, audio: false }); video.srcObject = stream; await video.play(); scanning = true; tick(); }catch(err){ alert("الكاميرا مش فتحت. افتح صلاحية الكاميرا للصفحة من إعدادات المتصفح.\n" + err); } } function stopCamera(){ scanning = false; if(stream){ stream.getTracks().forEach(t => t.stop()); stream = null; } } function tick(){ if(!scanning) return; if(video.readyState === video.HAVE_ENOUGH_DATA){ canvas.width = video.videoWidth; canvas.height = video.videoHeight; ctx.drawImage(video, 0, 0, canvas.width, canvas.height); const img = ctx.getImageData(0,0,canvas.width,canvas.height); const code = jsQR(img.data, img.width, img.height, { inversionAttempts: "dontInvert" }); if(code && code.data){ const id = tryExtractOrderId(code.data); if(id && !scanned.has(id)){ scanned.add(id); renderList(); try { beep.currentTime = 0; beep.play(); } catch(e) {} // منع تكرار القراءة بسرعة setTimeout(()=>requestAnimationFrame(tick), 650); return; } } } requestAnimationFrame(tick); } async function sendBulk(){ if(scanned.size === 0){ alert("مفيش IDs متسجلة."); return; } const ids = Array.from(scanned).join(","); const status = statusEl.value; // ده EndPoint لازم نعمله في Google Apps Script (هقولك تحت) const url = `${WEB_APP_URL}?action=bulkUpdateStatus&status=${encodeURIComponent(status)}&ids=${encodeURIComponent(ids)}&v=${Date.now()}`; try{ const res = await fetch(url, { method:"GET" }); const txt = await res.text(); alert("تم ✅\n" + txt); }catch(e){ alert("حصل خطأ في الاتصال بالويب آب.\n" + e); } } startBtn.onclick = startCamera; clearBtn.onclick = ()=>{ scanned.clear(); renderList(); }; sendBtn.onclick = sendBulk; renderList();