Bỏ qua để đến nội dung

Máy in bill

import { Aside } from ‘@astrojs/starlight/components’;

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" />.

Máy in bill — danh sách thiết bị trong hub 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".

  • 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ần settings ghi để 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).

Từ shell Thu ngân → Cài đặt → Máy in bill (/point-of-sale/settings/printer).

Click + Thêm thiết bị → chọn Máy in bill (receipt_printer).

TrườngBắt buộcGhi 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)
IPchỉ TCPĐịa chỉ IP máy in trên LAN
Portchỉ TCPCổng TCP (thường 9100)
Loại giấy✓Mặc định 80mm
Mẫu intùy chọnLiên kết với ReceiptTemplate đã tạo trong Dashboard

Source: device-settings-form.schema.ts.

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.

Sau khi thiết bị OK, vào Cài đặt cửa hàng → In bill (trong Dashboard):

Chế độHành vi
TắtKhông in gì, không hỏi
HỏiSau thanh toán hiện dialog “In / Xem trước / Bỏ qua”
Tự độngIn 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ị).

Bill in ra gồm:

  1. Logo cửa hàng (PNG ≥ 300dpi, upload trong Dashboard → Branding).
  2. Header: tên cửa hàng, địa chỉ, SĐT.
  3. Dòng hàng: tên + số lượng + đơn giá + thành tiền.
  4. Tổng + giảm giá + thuế (nếu có).
  5. Mã vạch hóa đơn — Code128 từ client_order_id (KHÔNG phải EAN-13 từ id số).
  6. Metadata terminal khi thanh toán thẻ (mã giao dịch, số terminal, loại thẻ).
Triệu chứngXử lý
Không in sau thanh toánChế độ đ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ùngKhô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ạnhUpload 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ốiKhớp chiều rộng giấy (80mm) với cuộn thực tế
Tình huốngHành động
Bill không in, không hỏiKiể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 inVấ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 caPing IP máy in; thử Kết nối lại trong bridge

Xem thêm: FAQ — In & thiết bị.

  • Component: <DeviceSettings hardwareFocus="printers"> (DeviceSettings.tsx)
  • Form: device-printer-settings-form.tsx
  • Constants: device-settings.constants.ts (kiểu receipt_printer, CASH_DRAWER_PRINTER_TYPE)
  • API: fetchVendorDevicesSettings, patchVendorDevicesSettings