Máy in bill
import { Aside } from ‘@astrojs/starlight/components’;
Tình huống sử dụng
Phần tiêu đề “Tình huống sử dụng”Sau khi thanh toán thành công, hệ thống tự động in 1 bill giấy cho khách. Bài viết này cho chủ cửa hàng cấu hình máy in (không phải cashier bán hàng).
Source: apps/vendor-web/src/app/point-of-sale/pages/settings/settings-hardware-printer-page.tsx + <DeviceSettings hardwareFocus="printers" />.
Hình: Trang cấu hình máy in bill — danh sách thiết bị (TCP / USB / SYSTEM), toggle bật/tắt, nút kích hoạt bridge. Spec owner: cashier-screenshots.spec.ts → "settings — receipt printer".
Trước khi bắt đầu
Phần tiêu đề “Trước khi bắt đầu”- Vendor Desktop phải chạy trên PC quầy — máy in bill kết nối qua app này, không chạy được trên trình duyệt.
- Cashier không cần quyền
settingsđể bán, nhưng cầnsettingsghi để cấu hình máy in (chỉ chủ). - Biết IP + port của máy in TCP, hoặc tên máy in cục bộ (trong Windows / macOS).
4 bước cấu hình
Phần tiêu đề “4 bước cấu hình”Bước 1 — Mở trang máy in bill
Phần tiêu đề “Bước 1 — Mở trang máy in bill”Từ shell Thu ngân → Cài đặt → Máy in bill (/point-of-sale/settings/printer).
Bước 2 — Thêm thiết bị
Phần tiêu đề “Bước 2 — Thêm thiết bị”Click + Thêm thiết bị → chọn Máy in bill (receipt_printer).
| Trường | Bắt buộc | Ghi chú |
|---|---|---|
| Tên | ✓ | Tên hiển thị trong hub |
| Phương thức | ✓ | TCP (in qua mạng) hoặc USB (cắm trực tiếp) hoặc SYSTEM (in qua driver hệ điều hành) |
| IP | chỉ TCP | Địa chỉ IP máy in trên LAN |
| Port | chỉ TCP | Cổng TCP (thường 9100) |
| Loại giấy | ✓ | Mặc định 80mm |
| Mẫu in | tùy chọn | Liên kết với ReceiptTemplate đã tạo trong Dashboard |
Source: device-settings-form.schema.ts.
Bước 3 — Bật thiết bị
Phần tiêu đề “Bước 3 — Bật thiết bị”Gạt toggle Bật/Tắt sang xanh. Thiết bị tắt sẽ không nhận lệnh in khi thanh toán.
Bước 4 — Kích hoạt bridge (chỉ máy in TCP)
Phần tiêu đề “Bước 4 — Kích hoạt bridge (chỉ máy in TCP)”Nếu dùng TCP, component kiểm tra localPrinterReady (resolveLocalReceiptPrinterConfigReady(device)):
Nếu muốn bridge pair (đồng bộ trạng thái với server), click “Kích hoạt bridge” → mỗi terminal in tạo 1 lane code.
canOpenPosBridgeActivate cho printer yêu cầu: là receipt_printer AND là TCP AND có IP + port. USB/SYSTEM chỉ in local.
Chế độ in bill
Phần tiêu đề “Chế độ in bill”Sau khi thiết bị OK, vào Cài đặt cửa hàng → In bill (trong Dashboard):
| Chế độ | Hành vi |
|---|---|
| Tắt | Không in gì, không hỏi |
| Hỏi | Sau thanh toán hiện dialog “In / Xem trước / Bỏ qua” |
| Tự động | In ngay sau thanh toán thành công (mặc định khu vực thường) |
Source: ReceiptPrintModeForm (chọn trong form thiết bị).
Kết quả mong đợi
Phần tiêu đề “Kết quả mong đợi”Bill in ra gồm:
- Logo cửa hàng (PNG ≥ 300dpi, upload trong Dashboard → Branding).
- Header: tên cửa hàng, địa chỉ, SĐT.
- Dòng hàng: tên + số lượng + đơn giá + thành tiền.
- Tổng + giảm giá + thuế (nếu có).
- Mã vạch hóa đơn — Code128 từ
client_order_id(KHÔNG phải EAN-13 từ id số). - Metadata terminal khi thanh toán thẻ (mã giao dịch, số terminal, loại thẻ).
Lỗi thường gặp
Phần tiêu đề “Lỗi thường gặp”| Triệu chứng | Xử lý |
|---|---|
| Không in sau thanh toán | Chế độ đang là Tắt; hoặc thiết bị chưa bật |
| Mở “Xem trước” thay vì in | Đang ở chế độ Hỏi — cashier chọn In thay vì đóng dialog |
| In ra nhiều bill trùng | Không bấm OK trên dialog xem trước 2 lần — hệ thống coi như 1 đơn |
| Logo mờ / mất cạnh | Upload lại PNG ≥ 300dpi; bật ảnh nét trong template |
| Mã vạch không quét được | Đảm bảo dùng Code128, không EAN-13 |
| In lệch font / mất dòng cuối | Khớp chiều rộng giấy (80mm) với cuộn thực tế |
Khắc phục sự cố nhanh
Phần tiêu đề “Khắc phục sự cố nhanh”| Tình huống | Hành động |
|---|---|
| Bill không in, không hỏi | Kiểm tra thiết bị đã bật + chế độ in trong Cài đặt cửa hàng |
| Bill in thử OK, đơn thật không in | Vấn đề ở flow thanh toán — kiểm tra tender xong API có trả print=true |
| USB không nhận | Đổi cáp / cổng; trên macOS kiểm tra Privacy & Security → USB |
| TCP mất kết nối giữa ca | Ping IP máy in; thử Kết nối lại trong bridge |
Xem thêm: FAQ — In & thiết bị.
Kỹ thuật
Phần tiêu đề “Kỹ thuật”- Component:
<DeviceSettings hardwareFocus="printers">(DeviceSettings.tsx) - Form:
device-printer-settings-form.tsx - Constants:
device-settings.constants.ts(kiểureceipt_printer,CASH_DRAWER_PRINTER_TYPE) - API:
fetchVendorDevicesSettings,patchVendorDevicesSettings