Skip to content

Giao diện POS (Renderer)

1. Kiểm soát Tài liệu

Thuộc tínhGiá trị
Gói@nx-app/sale-renderer
Phiên bản0.0.0
LoạiỨng dụng Web (SPA)
RuntimeTauri WebView / Trình duyệt
FrameworkReact 19 + Vite 7

2. Phạm vi & Mục tiêu

2.1. Phạm vi

Giao diện POS là lớp hình ảnh và tương tác của hệ thống Điểm bán hàng. Nó chạy bên trong WebView được cung cấp bởi tiến trình host Tauri (sale-main) và xử lý tất cả các tương tác của người dùng, luồng nghiệp vụ và phản hồi hình ảnh.

2.2. Mục tiêu

  • Tối ưu hóa Cảm ứng: Các phần tử giao diện có kích thước phù hợp cho tương tác chạm (mục tiêu tối thiểu 44px).
  • Tốc độ: Phản hồi tức thì cho các thao tác giỏ hàng.
  • Rõ ràng: Thiết kế độ tương phản cao cho các điều kiện ánh sáng khác nhau.
  • Hỗ trợ Ngoại tuyến: Các tính năng cốt lõi hoạt động không cần mạng.
  • Cập nhật Thời gian thực: Tích hợp WebSocket cho trạng thái đơn hàng.

3. Ngăn xếp Công nghệ

3.1. Framework Cốt lõi

Công nghệPhiên bảnMục đích
React^19.2.0Thư viện Thành phần UI
React DOM^19.2.0Kết xuất DOM
React Router^7.11.0Định tuyến phía Client
TypeScript~5.9.3An toàn kiểu dữ liệu

3.2. Quản lý Trạng thái

Công nghệPhiên bảnMục đích
Redux Toolkit^2.11.2Quản lý Trạng thái Toàn cục
React Redux^9.2.0Liên kết React-Redux
TanStack Query^5.90.12Trạng thái Server & Caching
ra-core^5.13.4Lõi Framework Admin

3.3. Thành phần UI

Công nghệPhiên bảnMục đích
Radix UIVariousCác thành phần cơ sở dễ tiếp cận
Tailwind CSS^4.1.18Utility-first Styling
Lucide React^0.562.0Thư viện Biểu tượng
shadcn^3.6.2Mẫu Thành phần
cmdk^1.1.1Bảng lệnh
vaul^1.1.2Thành phần Ngăn kéo
sonner^2.0.7Thông báo Toast

3.4. Tích hợp Tauri

Công nghệPhiên bảnMục đích
@tauri-apps/api^2.9.1Giao tiếp IPC
@tauri-apps/plugin-os^2.3.2Thông tin Hệ điều hành
@skipperndt/plugin-machine-uid^0.1.3Nhận dạng Thiết bị

3.5. Biểu mẫu & Xác thực

Công nghệPhiên bảnMục đích
React Hook Form^7.69.0Quản lý Trạng thái Biểu mẫu
@hookform/resolvers^5.2.2Tích hợp Schema
Zod^4.2.1Xác thực thời gian chạy

3.6. Trực quan hóa Dữ liệu

Công nghệPhiên bảnMục đích
Recharts2.15.4Biểu đồ & Đồ thị
react-qr-code^2.0.18Tạo Mã QR
react-day-picker^9.13.0Chọn ngày

3.7. Giao tiếp Thời gian thực

Công nghệPhiên bảnMục đích
socket.io-client^4.8.3Giao tiếp WebSocket
RxJS^7.8.2Reactive Streams

3.8. Bố cục & Tương tác

Công nghệPhiên bảnMục đích
react-grid-layout^2.2.2Bố cục Dashboard
react-resizable^3.1.3Bảng có thể thay đổi kích thước
react-virtuoso^4.17.0Danh sách ảo hóa
@tanstack/react-virtual^3.13.13Cuộn ảo

3.9. Build & Phát triển

Công nghệPhiên bảnMục đích
Vite^7.2.4Công cụ Build
@vitejs/plugin-react^5.1.1Tích hợp React
lightningcss^1.30.2Xử lý CSS
ESLint^9.39.1Kiểm tra lỗi mã nguồn
Prettier3.6.2Định dạng mã nguồn

4. Kiến trúc

4.1. Các lớp Ứng dụng

Người dùng Chạm
React UI
Dịch vụ IPC
Tauri Backend

4.2. Giao tiếp IPC

Renderer giao tiếp với Tauri backend thông qua một dịch vụ IPC tùy chỉnh:

typescript
export class IpcRendererService {
  async invoke<TPayload, TResponse>(opts: {
    command: string;
    payload: TPayload;
  }): Promise<TResponse> {
    const res = await invoke(command, { payload });
    return { data: res } as TResponse;
  }
}

4.3. Mẫu Data Provider

Sử dụng TauriIpcDataProvider tùy chỉnh mở rộng mẫu REST provider:

typescript
export class TauriIpcDataProvider extends DefaultRestDataProvider {
  override send<TResponse>(opts: {
    resource: string;
    params: ISendParams;
  }): Promise<ISendResponse<TResponse>> {
    return ipcService.invoke({
      command: resource,
      payload: params,
    });
  }
}

5. Cấu trúc Dự án

apps/sale-renderer/
├── src/
│   ├── application/                # DI Container & Providers
│   │   ├── decorators/             # Decorator tùy chỉnh
│   │   ├── providers/              # Auth & IPC Providers
│   │   │   ├── auth.provider.ts    # Provider xác thực
│   │   │   └── ipc-data.provider.ts # Tauri IPC data provider
│   │   └── services/               # Dịch vụ API
│   │       ├── apis/               # Domain API Clients (15 files)
│   │       ├── environment.service.ts
│   │       └── ipc.service.ts      # Tauri IPC wrapper
│   ├── components/                 # Thành phần UI tái sử dụng
│   │   └── ui/                     # Thành phần shadcn/ui
│   ├── constants/                  # Hằng số Ứng dụng
│   ├── helpers/                    # Các hàm Tiện ích
│   ├── hooks/                      # React Hooks tùy chỉnh
│   ├── interfaces/                 # Giao diện TypeScript
│   ├── layout/                     # Thành phần Bố cục
│   ├── libs/                       # Cấu hình Thư viện ngoài
│   ├── redux/                      # Redux Store
│   │   └── slices/                 # Redux Slices (8 slices)
│   ├── screens/                    # Thành phần Màn hình (8 modules)
│   └── socket/                     # Tích hợp WebSocket
│       ├── client/                 # Socket client
│       └── server/                 # Socket server handlers
├── scripts/                        # Script Build
└── public/                         # Tài sản Tĩnh

6. Màn hình & Định tuyến

6.1. Module Màn hình

ModuleĐường dẫnMô tả
home/Dashboard với widget và thống kê
sale/saleGiao diện POS chính với giỏ hàng
customer/customerQuản lý khách hàng
settings/settingsCài đặt ứng dụng
sign-in/sign-inXác thực
errors/401, /403, /404Trang lỗi

6.2. Thành phần Màn hình Bán hàng

Màn hình bán hàng là giao diện chính với các thành phần con phức tạp:

screens/sale/
├── index.tsx                       # Màn hình bán hàng chính
├── fnb/                            # Danh mục Thực phẩm & Đồ uống
│   ├── category/                   # Điều hướng danh mục
│   └── product-variant/            # Lựa chọn biến thể sản phẩm
├── cart/                           # Giỏ hàng mua sắm
│   ├── items/                      # Danh sách mục giỏ hàng
│   │   ├── header/                 # Tiêu đề giỏ hàng
│   │   └── item/                   # Mục riêng lẻ
│   ├── detail/                     # Xem chi tiết giỏ hàng
│   └── summary/                    # Tóm tắt giỏ hàng
│       ├── details/                # Chi tiết giá
│       └── actions/                # Các hành động giỏ hàng
│           ├── order-checkout/     # Nút thanh toán
│           └── payment-dialog/     # Modal thanh toán
│               ├── order-detail/   # Tóm tắt đơn hàng
│               └── stepper/        # Các bước thanh toán
│                   ├── methods/    # Phương thức thanh toán
│                   └── actions/    # Hành động từng bước
└── manual-form/                    # Form nhập thủ công

7. Quản lý Trạng thái

7.1. Cấu hình Redux Store

typescript
const appReducer = combineReducers({
  temporary: temporaryReducer,
  common: commonReducer,
  userProfile: userProfileReducer,
  order: orderReducer,
  sale: saleReducer,
  cart: cartReducer,
  product: productReducer,
  payment: paymentReducer,
});

7.2. Redux Slices

SliceMục đíchTrạng thái Chính
cartQuản lý giỏ hàngItems, tổng cộng, thuế, phương thức thanh toán
orderXử lý đơn hàngĐơn hàng hiện tại, lịch sử đơn hàng
paymentTrạng thái thanh toánPhương thức thanh toán, trạng thái, nỗ lực
productTrạng thái danh mục sản phẩmSản phẩm đang hoạt động, lựa chọn
saleTrạng thái phiên bán hàngPhiên hoạt động, chế độ
userProfileThông tin người dùngHồ sơ, tùy chọn
commonTrạng thái UI chungCờ, cài đặt
temporaryDữ liệu tạm thờiBản nháp form

7.3. Cấu trúc Trạng thái Giỏ hàng

typescript
interface ICartState {
  cartList: [];
  cartItems: { [id: string]: ICartItem };
  productVariantToCartItemsMap: { [variantId: string]: string };

  // Tính toán giá
  totalPrice: number;
  totalPurchaseVoucherPrice: number;
  totalDiscountVoucherPrice: number;
  totalTaxPrice: number;
  totalPaymentPrice: number;

  taxPercentage: string;
  paymentMethod: PaymentMethod;
}

7.4. Hành động Giỏ hàng

Hành độngMô tả
resetCartĐặt lại về trạng thái ban đầu
resetCartAfterPaymentXóa giỏ hàng sau khi thanh toán thành công
loadCartItemsTải các mục từ backend
addCartItemThêm mục vào giỏ hàng
removeCartItemXóa mục khỏi giỏ hàng
updateQuantityCartItemCập nhật số lượng mục
updateTaxPercentageĐặt thuế suất

8. Dịch vụ API

8.1. Dịch vụ API IPC

Tất cả các dịch vụ API giao tiếp qua Tauri IPC:

Dịch vụLệnhMô tả
AuthApisign_in, sign_out, who_am_iXác thực
UserApiget_user_profileHồ sơ người dùng
CategoryApiCRUD operationsDanh mục
ProductApiCRUD operationsSản phẩm
ProductVariantApiCRUD operationsBiến thể
MerchantApiCRUD operationsMerchant
OrganizerApiCRUD operationsTổ chức
SaleChannelApiCRUD operationsKênh bán hàng
CartApicart_items, add_item, clearQuản lý giỏ hàng
CartItemApiupdate_quantityThao tác mục
OrderApicheckout, revert_checkoutXử lý đơn hàng
PaymentApicheckout, cancel, system_ipnThanh toán
PaymentAttemptApifind_by_idThử thanh toán
AssetApii18n_file, vnpay_qr_frameTài sản

9. Tích hợp WebSocket

9.1. Kiến trúc Socket

socket/
├── client/                         # Client-side socket
│   ├── index.ts                    # Socket client exports
│   ├── socket-connection-manager.ts # Quản lý kết nối
│   └── socket-subscription-manager.ts # Xử lý đăng ký
├── server/                         # Server message handlers
│   ├── base/                       # Các lớp socket cơ sở
│   │   ├── base-socket.ts          # Lớp socket cơ sở
│   │   └── base-socket-subscription-manager.ts
│   ├── messages/                   # Trình xử lý tin nhắn
│   │   └── market-data-socket-message-handler.ts
│   └── order-socket.service.ts     # Dịch vụ socket đơn hàng
├── constants.ts                    # Hằng số socket
├── helper.ts                       # Tiện ích socket
├── types.ts                        # Kiểu dữ liệu socket
└── index.ts                        # Main exports

9.2. Tính năng Socket

  • Cập nhật Trạng thái Đơn hàng: Thay đổi trạng thái đơn hàng thời gian thực
  • Dữ liệu Thị trường: Cập nhật giá trực tiếp
  • Quản lý Kết nối: Tự động kết nối lại khi mất kết nối
  • Hệ thống Đăng ký: Đăng ký/hủy đăng ký các kênh

10. Thành phần Radix UI

10.1. Các Primitives đã cài đặt

Thành phầnPhiên bảnSử dụng
Accordion^1.2.12Các phần có thể thu gọn
Alert Dialog^1.1.15Modal xác nhận
Avatar^1.1.11Ảnh đại diện người dùng
Checkbox^1.3.3Ô chọn form
Collapsible^1.1.12Bảng mở rộng
Context Menu^2.2.16Menu chuột phải
Dialog^1.1.15Hộp thoại modal
Dropdown Menu^2.1.16Menu thả xuống
Label^2.1.8Nhãn biểu mẫu
Popover^1.1.15Bảng nổi
Radio Group^1.3.8Lựa chọn radio
Scroll Area^1.2.10Thanh cuộn tùy chỉnh
Select^2.2.6Lựa chọn thả xuống
Separator^1.1.8Phân cách trực quan
Slot^1.2.4Khe thành phần
Switch^1.2.6Công tắc chuyển đổi
Tabs^1.1.13Điều hướng tab
Tooltip^1.2.8Chú thích khi di chuột

11. Hệ thống Giỏ hàng

11.1. Tính năng Giỏ hàng

  • Gộp mục: Nhóm các mục giống hệt nhau theo biến thể
  • Quản lý Số lượng: Tăng/giảm với xác thực
  • Tính toán Giá: Tổng phụ thời gian thực, thuế, chiết khấu
  • Phương thức Thanh toán: Hỗ trợ Tiền mặt, QR, Thẻ
  • Xử lý Thuế: Phần trăm thuế có thể cấu hình

11.2. Logic Tính toán Giá

typescript
// Tính tổng
totalPrice = items.reduce((sum, item) =>
  sum + item.unitPrice * item.quantity, 0);

// Áp dụng chiết khấu và thuế
const taxableAmount = Math.max(0, totalPrice - discount);
totalTaxPrice = Math.round(taxableAmount * (taxRate / 100));

totalPaymentPrice = totalPrice
  - totalDiscountVoucherPrice
  - totalPurchaseVoucherPrice
  + totalTaxPrice;

12. Luồng Thanh toán (Checkout Flow)

12.1. Sơ đồ Luồng

Xem lại Giỏ hàng
Liên kết Khách hàng
Chọn Thanh toán
Xử lý Thanh toán

12.2. Các bước Thanh toán

  1. Xem lại Giỏ hàng: Xác minh cuối cùng các mục
  2. Liên kết Khách hàng: Liên kết khách hàng tùy chọn
  3. Lựa chọn Thanh toán: Chọn Tiền mặt, QR, hoặc Thẻ
  4. Thực thi Giao dịch: Xử lý qua Tauri IPC
  5. Tạo Biên lai: Định dạng cho máy in
  6. Hoàn tất Đơn hàng: Xóa giỏ hàng và cập nhật trạng thái

13. Điểm Tích hợp

13.1. Thượng nguồn (Tauri Backend)

  • Lệnh IPC: Gọi các hàm Rust qua @tauri-apps/api
  • Sự kiện: Lắng nghe init_ready, init_error, migration_error
  • API Cửa sổ: Quản lý cửa sổ, màn hình ngoài

13.2. Ngang hàng (Các gói Dùng chung)

  • @nx-app/core: Tiện ích và locales dùng chung
  • @minimaltech/ra-core-infra: Cơ sở hạ tầng dịch vụ cơ bản
  • @venizia/ignis-inversion: IoC container

13.3. Hạ nguồn (Backend API)

  • WebSocket: Cập nhật đơn hàng thời gian thực
  • Telemetry: Ghi log lỗi và phân tích

14. Build & Scripts

14.1. Các Script có sẵn

ScriptLệnhMục đích
devvite --mode devDevelopment server
buildsh ./scripts/build.shBuild sản xuất
build:developsh ./scripts/rebuild.sh developmentBuild phát triển
build:productionsh ./scripts/rebuild.sh productionBuild sản xuất
previewvite previewXem trước build
lintsh ./scripts/lint.shKiểm tra ESLint
prettierprettier '**/*.{js,ts,jsx,tsx}' --writeĐịnh dạng mã

14.2. Đầu ra Build

Bản build được tiêu thụ bởi tiến trình host Tauri:

  • Thư mục đầu ra: dist/
  • Được phục vụ bởi plugin localhost của Tauri
  • Được nhúng trong ứng dụng desktop/mobile

15. Thống kê Mã nguồn

Chỉ sốSố lượng
Tệp Nguồn~337
Module Màn hình8
Redux Slices8
Dịch vụ API15
Thành phần Radix18
Trình xử lý Socket5+
Custom Hooks10+

Proprietary and Confidential. Unauthorized copying, distribution, or use of this software is strictly prohibited.