> ## Documentation Index
> Fetch the complete documentation index at: https://docs.plato.ae/llms.txt
> Use this file to discover all available pages before exploring further.

# تدفق الطباعة

> كيف تنتقل الوظائف من Plato POS إلى الطابعة الحرارية.

# تدفق الطباعة

برنامج تشغيل الطابعة PC يعود عمداً بسرعة من `/print`. يحدث الإدخال/الإخراج الفعلي للطابعة في عامل الخلفية للطابعة المستهدفة.

## التدفق من النهاية إلى النهاية

1. تعرض وحدة التحكم Plato إيصالًا أو تذكرة أو تقريرًا إلى PNG blob.
2. يقوم محول Console `WIN_DRIVER` بتحويل الصورة إلى صفوف نقطية باللون الأسود/الأبيض.
3. يتم تقسيم الصفوف النقطية إلى أجزاء مكونة من 128 صفًا.
4. يتم تشفير كل قطعة كأمر نقطي ESC/POS وترميز base64.
5. ترسل وحدة التحكم `POST /print` مع `ip_address` و`port` و`chunks`.
6. يقوم برنامج التشغيل بتغليف القطع بتأخيرات صغيرة، وإضافة التغذية/القص، وإضافة أوامر صوتية بشكل اختياري.
7. تتم إضافة المهمة إلى قائمة انتظار BullMQ الخاصة بالطابعة.
8. يقوم العامل بفتح مقبس TCP للطابعة.
9. يرسل العامل تهيئة ESC/POS، ثم كل قطعة.
10. يقوم العامل بإغلاق اتصال الطابعة بعد المهمة.

## تقطيع وحدة التحكم

يستخدم محول وحدة التحكم:

| جلسة                  | قيمة         |
| --------------------- | ------------ |
| نوع السائق            | `WIN_DRIVER` |
| ارتفاع القطعة النقطية | صفوف `128`   |
| مهلة الحالة           | `3000ms`     |
| مهلة طلب الطباعة      | `5000ms`     |
| مهلة درج النقود       | `3000ms`     |

يرسل المتصفح قطعًا نقطية مشفرة بالفعل. لا يعرض برنامج التشغيل HTML.

## التفاف قطعة السائق

يقوم `receipt-encoder.ts` بتحويل الأجزاء الواردة إلى أجزاء مهمة:

* يتم فك تشفير كل قطعة واردة من base64.
* تحصل كل قطعة طباعة على `delayAfterMs: 25`.
* يتم إلحاق أمر التغذية والقطع الجزئي.
* إذا كان `beep` صحيحًا، فسيتم إلحاق 18 أمرًا صوتيًا.
* تحتوي كل قطعة صوتية على `delayAfterMs: 150`.

## أوامر ESC/POS

| يأمر           | بايت                      | غاية                             |
| -------------- | ------------------------- | -------------------------------- |
| تهيئة          | `1B 40`                   | أعد ضبط الطابعة قبل كل مهمة.     |
| الصورة النقطية | `1D 76 30 00 ...`         | أرسلت بواسطة قطع وحدة التحكم.    |
| يٌطعم          | `0A 0A 0A 0A`             | إطعام قبل القطع.                 |
| قطع جزئي       | تم إنشاؤها بواسطة التشفير | قطع الورق الجزئي.                |
| زمارة          | `1B 42 01 01`             | تكرار أمر الصفارة من قبل السائق. |
| درج النقود     | `1B 70 00 19 FA`          | نبض درج ركلة.                    |

## دورة حياة المقبس

يقوم العامل الحالي بفتح وإغلاق اتصال الطابعة لكل مهمة.

| ثابت                      | قيمة   | غاية                                            |
| ------------------------- | ------ | ----------------------------------------------- |
| `OPEN_ATTEMPT_TIMEOUT_MS` | `2000` | الحد الأقصى للوقت لفتح مقبس TCP.                |
| `CONNECTION_COOLDOWN_MS`  | `250`  | الحد الأدنى من التأخير بعد الإغلاق قبل فتح آخر. |
| `CLOSE_TIMEOUT_MS`        | `250`  | ماكس انتظر إغلاقًا رشيقًا قبل التدمير.          |
| `WRITE_TIMEOUT_MS`        | `6000` | أقصى وقت للكتابة بمقبس واحد.                    |

يوجد أيضًا مؤقت تحرير خامل لـ `3000ms`، لكن مسار العملية الحالي يغلق الاتصال فورًا بعد كل مهمة ناجحة.

## مسار الفشل

في حالة فشل الفتح أو الكتابة:

1. تم وضع علامة `offline` على الطابعة.
2. تم تحرير/تدمير المقبس.
3. فشلت مهمة BullMQ.
4. يقوم BullMQ بإعادة المحاولة بعد `queue.retryDelayMs`.
5. عند الوصول إلى الطابعة مرة أخرى، يتم ترقية مهام إعادة المحاولة المؤجلة ما لم يتم جدولتها بشكل مقصود مع `runAt` في المستقبل.

## فحص الحالة

يمكن لـ `POST /status` فحص الطابعة فقط عندما لا يكون عمل قائمة الانتظار نشطًا. يؤدي ذلك إلى تجنب فتح مقبس المسبار أثناء انشغال الطابعة نفسها بالطباعة.
