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

Máy in tem, cân và ngăn kéo tiền

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

Thiết bịKhi nào dùngRouteSource
Máy in temIn tem kệ / tem barcode/point-of-sale/settings/label-printersettings-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ềnBán tiền mặt tự động bật ngăn/point-of-sale/settings/cash-drawer (<DeviceSettings hardwareFocus="cash-drawer">)DeviceSettings.tsx

Máy in tem — bàn làm việc Electron 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)".

Cân điện tử — cấu hình thiết bị 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".

Ngăn kéo tiền — cấu hình device 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".

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.

  1. Cài đặt → Máy in tem (/point-of-sale/settings/label-printer) — chỉ trên Vendor Desktop.
  2. Đả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”.
  3. 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.
  4. Chọn máy in hệ thống (printerName) từ dropdown systemPrintersQuery — Electron gọi electronApi.listPrinters(). Có thể để trống để in qua máy in mặc định.
  5. 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; // ~ 89mm
LABEL_PAPER_HEIGHT_IN = 1.1; // ~ 28mm
LABEL_PRINTER_MIN_COPIES = 1;
LABEL_PRINTER_MAX_COPIES = 100;
LABEL_PRINTER_MAX_CONTENT_LINE_LENGTH = 64;
LABEL_PRINTER_MAX_PRICE_LENGTH = 24;

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).

Triệu chứngXử 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 dropdownVendor 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ạnhCó thể đang in qua driver không hỗ trợ kích thước 3.5in × 1.1in

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á.

  1. Cài đặt → Cân (/point-of-sale/settings/scale).
  2. Click + Thêm thiết bị → chọn loại Cân điện tử (weighing_scale).
  3. Chọn phương thức kết nối:
    • USB Serial (RS-232 qua USB) — baud rate mặc định DEFAULT_SCALE_BAUD_RATE từ pos-scale-serial.constants.ts.
    • USB HID — driver không cần cài, plug-and-play.
  4. Chọn model cân (model) — các model USB Serial preset dùng isUsbSerialScaleModelPreset(...). Bật thiết bị.

Source: device-scale-settings-form.tsx, pos-scale-serial-config.ts.

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.

Triệu chứngXử lý
Cân không phản hồiKiểm tra cáp / cổng USB; thử cổng khác
Số kg không tự cập nhật khi đặt hàngCân có thể chưa ở chế độ gửi dữ liệu (xem manual cân)
Pill “Local ready” không sángThiếu baud rate / scaleConfig — kiểm tra lại form

Sau khi bán tiền mặt, ngăn kéo tự động bật ra để cashier đưa tiền thừa.

  1. Cài đặt → Ngăn kéo tiền (/point-of-sale/settings/cash-drawer).
  2. 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).
  3. Kết nối ngăn kéo với máy in bill qua cáp RJ12 (chuẩn phổ biến).
  4. 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.

Triệu chứngXử lý
Ngăn không bật sau tiền mặtKiể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 ngayCó thể ngăn bị kẹt cơ khí; cần kiểm tra cơ học