Máy in tem, cân và ngăn kéo tiền
import { Aside } from ‘@astrojs/starlight/components’;
3 thiết bị trong 1 bài
Phần tiêu đề “3 thiết bị trong 1 bài”| Thiết bị | Khi nào dùng | Route | Source |
|---|---|---|---|
| Máy in tem | In tem kệ / tem barcode | /point-of-sale/settings/label-printer | settings-label-printer-page.tsx |
| Cân điện tử | Hàng cân (thực phẩm tươi, rau quả) | /point-of-sale/settings/scale (<DeviceSettings hardwareFocus="scale">) | DeviceSettings.tsx |
| Ngăn kéo tiền | Bán tiền mặt tự động bật ngăn | /point-of-sale/settings/cash-drawer (<DeviceSettings hardwareFocus="cash-drawer">) | DeviceSettings.tsx |
Minh hoạ
Phần tiêu đề “Minh hoạ”
Hình: Bàn làm việc in tem — chọn template (price_left / boxed_price_per_lb), máy in hệ thống, ô preview, nút In. Spec owner: cashier-screenshots.spec.ts → "settings — label printer (workbench)".
Hình: Trang cấu hình cân — USB Serial / HID, badge “Local ready” khi cấu hình hợp lệ. Spec owner: cashier-screenshots.spec.ts → "settings — scale".
Hình: Trang ngăn kéo tiền — subtype của máy in bill, badge “Local ready”, test popup. Spec owner: cashier-screenshots.spec.ts → "settings — cash drawer".
1. Máy in tem (label printer)
Phần tiêu đề “1. Máy in tem (label printer)”Tình huống
Phần tiêu đề “Tình huống”In tem dán kệ cho sản phẩm mới hoặc sau kiểm kê. Dùng cho cửa hàng tạp hóa, siêu thị mini, mỹ phẩm.
Cấu hình (5 bước)
Phần tiêu đề “Cấu hình (5 bước)”- Cài đặt → Máy in tem (
/point-of-sale/settings/label-printer) — chỉ trên Vendor Desktop. - Đảm bảo đã chọn cửa hàng active trên top bar — nếu không, form ẩn và chỉ hiện dòng “Chọn cửa hàng”.
- Chọn mẫu tem (
templateKey):price_left— giá ở ô vuông bên trái, nội dung bên phải.boxed_price_per_lb— nội dung trong khung, dùng cho hàng tính theo pound.
- Chọn máy in hệ thống (
printerName) từ dropdownsystemPrintersQuery— Electron gọielectronApi.listPrinters(). Có thể để trống để in qua máy in mặc định. - Nhập giá + 2 dòng nội dung + số bản sao (1–100). Click In để qua Electron
printHtml, hoặc In qua dialog để mở print dialog của trình duyệt (fallback).
Source: settings-label-printer-page.tsx. Constants:
LABEL_PAPER_WIDTH_IN = 3.5; // ~ 89mmLABEL_PAPER_HEIGHT_IN = 1.1; // ~ 28mmLABEL_PRINTER_MIN_COPIES = 1;LABEL_PRINTER_MAX_COPIES = 100;LABEL_PRINTER_MAX_CONTENT_LINE_LENGTH = 64;LABEL_PRINTER_MAX_PRICE_LENGTH = 24;Kết quả mong đợi
Phần tiêu đề “Kết quả mong đợi”Toast “Print command sent” khi Electron in thành công. Nếu lỗi, fallback sang print dialog và hiện toast lỗi kèm lý do (printFailedWithReason).
Lỗi thường gặp
Phần tiêu đề “Lỗi thường gặp”| Triệu chứng | Xử lý |
|---|---|
| Form bị ẩn, chỉ thấy “Chọn cửa hàng” | Chưa chọn cửa hàng trên top bar |
| Không có máy in trong dropdown | Vendor Desktop chưa có quyền truy cập máy in hệ thống — cấp quyền trong OS |
Toast Print failed: … | Xem lý do trong toast; thử In qua dialog |
| Tem cắt cạnh | Có thể đang in qua driver không hỗ trợ kích thước 3.5in × 1.1in |
2. Cân điện tử (weighing scale)
Phần tiêu đề “2. Cân điện tử (weighing scale)”Tình huống
Phần tiêu đề “Tình huống”Cửa hàng bán hàng tính theo trọng lượng — rau, thịt, cá. Mỗi lần quét barcode sản phẩm cân, hệ thống tự lấy số kg từ cân và nhân giá.
Cấu hình (4 bước)
Phần tiêu đề “Cấu hình (4 bước)”- Cài đặt → Cân (
/point-of-sale/settings/scale). - Click + Thêm thiết bị → chọn loại Cân điện tử (
weighing_scale). - Chọn phương thức kết nối:
USB Serial(RS-232 qua USB) — baud rate mặc địnhDEFAULT_SCALE_BAUD_RATEtừpos-scale-serial.constants.ts.USB HID— driver không cần cài, plug-and-play.
- Chọn model cân (
model) — các model USB Serial preset dùngisUsbSerialScaleModelPreset(...). Bật thiết bị.
Source: device-scale-settings-form.tsx, pos-scale-serial-config.ts.
Khi nào cân ready
Phần tiêu đề “Khi nào cân ready”localScaleReady === true khi:
- Model USB Serial hợp lệ + scaleConfig JSON hợp lệ + baud rate hợp lệ.
Trên thẻ thiết bị sẽ hiện pill xanh “Local ready” + gợi ý “Local hint” — không cần bridge pair cho cân.
Lỗi thường gặp
Phần tiêu đề “Lỗi thường gặp”| Triệu chứng | Xử lý |
|---|---|
| Cân không phản hồi | Kiểm tra cáp / cổng USB; thử cổng khác |
| Số kg không tự cập nhật khi đặt hàng | Cân có thể chưa ở chế độ gửi dữ liệu (xem manual cân) |
| Pill “Local ready” không sáng | Thiếu baud rate / scaleConfig — kiểm tra lại form |
3. Ngăn kéo tiền (cash drawer)
Phần tiêu đề “3. Ngăn kéo tiền (cash drawer)”Tình huống
Phần tiêu đề “Tình huống”Sau khi bán tiền mặt, ngăn kéo tự động bật ra để cashier đưa tiền thừa.
Cấu hình (3 bước)
Phần tiêu đề “Cấu hình (3 bước)”- Cài đặt → Ngăn kéo tiền (
/point-of-sale/settings/cash-drawer). - Ngăn kéo là subtype của máy in bill — cấu hình máy in bill trước (
CASH_DRAWER_PRINTER_TYPE). - Kết nối ngăn kéo với máy in bill qua cáp RJ12 (chuẩn phổ biến).
- Click Test trên thẻ ngăn kéo — nếu ngăn bật là OK.
localCashDrawerReady === true khi cấu hình hợp lệ + đã pair với máy in bill.
Lỗi thường gặp
Phần tiêu đề “Lỗi thường gặp”| Triệu chứng | Xử lý |
|---|---|
| Ngăn không bật sau tiền mặt | Kiểm tra cáp RJ12; bật “Mở khi thanh toán tiền mặt” trong form |
| Test thủ công OK nhưng đơn thật không bật | Đơn phải dùng phương thức Tiền mặt — thẻ không mở ngăn |
| Ngăn bật nhưng đóng ngay | Có thể ngăn bị kẹt cơ khí; cần kiểm tra cơ học |