PRD: Combo & gói bán kèm
| Module | Sản phẩm (CORE-05) | PRD ID | PRD-BND-001 |
| Trạng thái | Shipped | Người phụ trách | Product squad |
| Ngày | 2026-06-15 | Phiên bản | v1.0 |
| Packages | @nx/core · @nx/commerce · @nx/sale | URD | BND · VAR |
TL;DR
Cho phép merchant bán nhiều biến thể như một thứ duy nhất. Một combo được định giá một lần và cấu thành từ các biến thể thành phần; ngay khi thêm vào giỏ, hệ thống bung nó phía máy chủ thành một dòng dẫn có giá cùng các dòng thành phần giá-không, để bếp thấy mọi thành phần còn hóa đơn hiển thị một giá. Một add-on gắn một biến thể miễn phí vào một dòng chủ tại điểm bán; một mục mua-kèm-thường-xuyên (FBT) gợi ý một biến thể liên quan và có thể mang giá ghi-đè riêng. Toàn bộ đồ thị gói được tạo liền mạch cùng biến thể, combo có thể lồng nhau, và việc bung được rào chắn khỏi độ sâu vượt mức, chu trình và combo rỗng.
1. Bối cảnh & Vấn đề
Danh mục đã mô tả được một biến thể bán đơn lẻ (VAR) và định giá nó qua một fare set (FAR). Nó chưa mô tả được quan hệ giữa hai biến thể - "bữa này gồm burger cộng khoai cộng nước", "tặng kèm một sốt", "người mua món này cũng mua món kia". Merchant bán những thứ này mỗi ngày, và một POS chỉ tính được biến thể phẳng buộc nhân viên gõ tay từng thành phần và đoán giá.
Tệ hơn, combo không chỉ là một nhãn: bếp cần thấy mọi thành phần vật lý để làm, kho cần trừ tồn từng thành phần, và hóa đơn cần hiển thị một giá - không phải tổng các phần. Thiếu một gói hạng-nhất, một "combo" hoặc là một dòng đơn không-thể-tách (bếp và kho mù về thành phần) hoặc một mớ các dòng định giá riêng mà nhân viên phải tự tay chiết khấu về không.
Increment này biến quan hệ gói thành hạng-nhất. Chủ khai báo các quan hệ combo / add-on / FBT trên một biến thể, và tại điểm bán hệ thống tự bung một combo thành dòng dẫn có giá cùng các thành phần giá-không, gắn add-on và FBT theo yêu cầu, và bảo vệ việc bung khỏi đồ thị cấu hình sai.
2. Mục tiêu & Không-mục-tiêu
Mục tiêu
- Liên kết hai biến thể bằng một gói có kiểu: COMBO, ADDON hoặc FBT (biến thể dẫn → biến thể liên quan).
- Combo mang giá riêng; thành phần được bung thành các dòng con giá-không tại lúc thêm vào giỏ.
- Nhân mỗi thành phần với số lượng combo, gộp một thành phần được đến từ nhiều nhánh vào một dòng.
- Hỗ trợ combo lồng nhau với trần độ sâu cứng, và từ chối combo vượt độ sâu, có chu trình, hoặc rỗng kèm lý do cụ thể.
- Gắn một add-on (luôn miễn phí) hoặc một mục FBT (giá riêng / giá ghi-đè) vào một dòng dẫn cấp-cao nhất hiện có tại điểm bán.
- Tạo toàn bộ đồ thị gói liền mạch cùng biến thể, và ghi lại combo cùng các dòng gói đã sinh ra mỗi dòng để dùng về sau.
Không-mục-tiêu
- Định giá bản thân combo - dòng dẫn combo được định giá qua fare set của nó (FAR); PRD này chỉ đưa thành phần về không.
- Số liệu tồn và cơ chế giữ chỗ - việc bung gói kích hoạt giữ chỗ, nhưng mô hình tồn nằm ở Kho.
- Định mức nguyên vật liệu / công thức sản xuất (đầu vào của biến thể sản xuất) - là một mối quan tâm riêng ở Kho.
- Chiết khấu khuyến mãi trên một gói - tính chiết khấu (CMP) là một tính năng riêng, đang triển khai.
- Sinh combo theo tổ hợp Descartes từ các trục tùy chọn - combo được khai báo, không sinh (OPT).
3. Chỉ số Thành công
| Chỉ số | Mục tiêu / tín hiệu |
|---|---|
| Phân rã combo | Mỗi combo trên một đơn sinh ra một dòng dẫn có giá cùng đủ bộ thành phần giá-không |
| Toàn vẹn giá | Số tiền hóa đơn của một combo bằng fare riêng của nó, không bao giờ là tổng các thành phần |
| An toàn bung | Không đơn nào được tạo từ một combo vượt độ sâu, có chu trình, hoặc không có thành phần |
| Chính xác số lượng | Số lượng dòng của một thành phần bằng số-lượng-mỗi-combo × số lượng combo, cộng dồn qua các nhánh |
| Gắn đúng | Một add-on / FBT chỉ gắn vào một dòng dẫn cấp-cao nhất khớp; combo không bao giờ gắn theo cách này |
4. Persona & Tình huống Sử dụng
| Persona | Mục tiêu trong tính năng này |
|---|---|
| Chủ / Quản lý | Khai báo thành phần combo, add-on có thể gắn, và gợi ý FBT trên danh mục |
| Thu ngân | Tính một combo như một dòng, gắn add-on hoặc chấp nhận gợi ý tại điểm bán |
| Bếp / Hoàn tất | Thấy mọi thành phần vật lý của một combo để chuẩn bị |
Tình huống cốt lõi: chủ dựng một biến thể "Combo Trưa" định giá một mức và khai báo thành phần - 1 burger, 1 khoai, 1 nước. Thu ngân thêm combo vào giỏ; hệ thống tạo một dòng dẫn có giá cho combo và ba dòng thành phần giá-không bên dưới. Thu ngân gắn một sốt thêm tính phí (FBT) vào dòng dẫn combo và một bộ khăn miễn phí (add-on) vào một dòng burger. Đặt hai combo làm mọi dòng thành phần tự nhân đôi số lượng.
5. User Story
- Là chủ, tôi khai báo thành phần combo với số lượng, để bếp và kho thấy phần thật còn khách thấy một giá.
- Là chủ, tôi tặng một add-on miễn phí trên một biến thể, để nhân viên gắn tại điểm bán mà không cần định lại giá.
- Là chủ, tôi gợi ý một món mua-kèm-thường-xuyên với giá riêng, để bán-thêm chỉ một chạm.
- Là thu ngân, tôi thêm một combo như một dòng duy nhất và để hệ thống điền thành phần, để không bao giờ gõ tay từng phần.
- Là thu ngân, tôi tăng số lượng combo và thấy mọi thành phần tự nhân theo, để đơn luôn đúng.
- Là nhân viên bếp, tôi thấy từng thành phần của một combo, để làm đúng những gì đã bán.
6. Yêu cầu Chức năng
| # | Yêu cầu | URD ref |
|---|---|---|
| FR-1 | Một gói liên kết một biến thể dẫn với một biến thể liên quan theo một trong ba kiểu: COMBO, ADDON, FBT | URD-BND-001 |
| FR-2 | Combo cấu thành từ các biến thể thành phần mỗi cái có số lượng riêng; combo được định giá, thành phần về không | URD-BND-002 |
| FR-3 | Một add-on liên kết một biến thể liên quan luôn-miễn-phí với một biến thể chủ | URD-BND-003 |
| FR-4 | Một mục FBT gợi ý một biến thể liên quan, có hướng, và có thể mang giá ghi-đè riêng (cố định / phần trăm / theo-đơn-vị / bậc thang) hoặc lùi về fare của biến thể được gợi ý | URD-BND-004 |
| FR-5 | Cùng một quan hệ (kiểu, dẫn, liên quan) không thể trùng lặp | URD-BND-005 |
| FR-6 | Các gói của một biến thể dẫn và một kiểu mang thứ tự hiển thị | URD-BND-006 |
| FR-7 | Các gói được tạo liền mạch cùng biến thể; mọi lỗi quay lui toàn bộ thao tác tạo | URD-BND-007 · URD-VAR-003 |
| FR-8 | Thêm một combo vào giỏ bung nó phía máy chủ thành một dòng dẫn có giá cùng các dòng con thành phần giá-không liên kết với dòng dẫn | URD-BND-008 |
| FR-9 | Số lượng mỗi thành phần là số-lượng-mỗi-combo × số lượng combo; một thành phần đến từ nhiều nhánh được gộp vào một dòng với số lượng cộng dồn | URD-BND-009 |
| FR-10 | Combo có thể lồng nhau; việc bung đệ quy đến tối đa năm cấp độ sâu | URD-BND-010 |
| FR-11 | Một combo vượt giới hạn độ sâu, tạo chu trình, hoặc không có thành phần bị từ chối kèm lý do cụ thể | URD-BND-011 |
| FR-12 | Dòng thành phần combo không thể sửa trực tiếp; chủ sửa dòng dẫn combo và các con tự nhân theo | URD-BND-012 |
| FR-13 | Một biến thể sản phẩm combo phải khai báo ít nhất một thành phần combo khi tạo | URD-BND-013 |
| FR-14 | Một mục add-on hoặc FBT gắn tại điểm bán vào một dòng dẫn cấp-cao nhất hiện có, được kiểm khớp với quan hệ đã cấu hình; combo không thể gắn theo cách này | URD-BND-014 |
| FR-15 | Một add-on vẫn giữ chỗ tồn cho thành phần của nó dù miễn phí | URD-BND-015 |
| FR-16 | Mỗi dòng dẫn combo và dòng thành phần ghi lại combo cùng các dòng gói đã sinh ra nó cho bếp / hoàn tiền / kiểm toán về sau | URD-BND-016 |
Toàn văn yêu cầu và tiêu chí chấp nhận nằm ở URD Sản phẩm - BND. PRD này tham chiếu thay vì lặp lại.
7. Yêu cầu Phi chức năng
| Lĩnh vực | Yêu cầu |
|---|---|
| Máy chủ quyết định | Việc bung combo và kiểu / giá của gói được quyết định ở máy chủ từ quan hệ đã lưu, không bao giờ tin theo client |
| Liền mạch | Dòng dẫn của một combo và mọi dòng thành phần được ghi cùng nhau; một lỗi rào tồn quay lui trước khi sửa bất kỳ dòng nào |
| Bung có giới hạn | Một bước nạp-trước đồ thị và một bước làm-phẳng lặp giới hạn công việc ở độ sâu tối đa cố định, kèm rào chắn chu trình và combo rỗng tường minh - một đồ thị sai không bao giờ lặp vô hạn |
| Độ chính xác | Số lượng thành phần được nhân và cộng ở độ chính xác thập phân (4 chữ số) |
| Đa thuê & phân quyền | Mọi thao tác giới hạn theo merchant (x-merchant-id) và chặn bởi quyền sản phẩm / bán |
| Khả năng kiểm toán | Mọi dòng combo và thành phần mang dòng dẫn combo cùng các dòng gói đã sinh ra nó |
| i18n | Tên combo và thành phần được mang song ngữ ({ en, vi }) trong snapshot mỗi dòng |
8. UX & Luồng
Giao diện danh mục cho chủ khai báo, trên một biến thể, các thành phần combo (kèm số lượng), các add-on có thể gắn, và các gợi ý FBT (kèm giá ghi-đè tùy chọn). Tại điểm bán một combo xuất hiện như một dòng duy nhất có giá với thành phần lồng bên dưới; nhân viên có thể gắn một add-on hoặc chấp nhận một gợi ý FBT vào một dòng dẫn.
9. Dữ liệu & Miền
| Thực thể | Vai trò trong gói |
|---|---|
ProductBundler | Một quan hệ có kiểu (COMBO / ADDON / FBT) từ một biến thể dẫn tới một biến thể liên quan, mang số lượng, một basis giá ghi-đè tùy chọn, và một thứ tự hiển thị |
ProductVariant | Một biến thể kiểu combo là dẫn của các dòng gói thành phần; một biến thể thường là một thành phần lá vật lý |
SaleOrderItem | Tại lúc thêm vào giỏ một combo trở thành một mục dẫn có giá cùng các mục con giá-không liên kết ngược về dẫn |
Chỉ ở mức khái niệm - schema và bất biến đầy đủ nằm ở mô hình miền commerce. Quan hệ là tham chiếu mềm; toàn vẹn được thực thi trong dịch vụ bung và tạo, không bởi ràng buộc CSDL.
10. Phụ thuộc & Giả định
Phụ thuộc vào
- Biến thể & tạo tổng hợp (VAR, URD-VAR-003) - các dòng gói được tạo cùng biến thể trong một giao dịch.
- Kiểu biến thể (URD-VAR-006) - kiểu COMBO của một biến thể là thứ khiến bộ bung đệ quy vào gói của nó.
- Fare & định giá (FAR) - dòng dẫn combo được định giá qua fare set riêng; thành phần về không.
- Kho (Kho) - mỗi thành phần được bung giữ chỗ tồn tại lúc thêm vào giỏ.
@nx/sale- dịch vụ đơn bung một combo và gắn add-on / FBT tại điểm bán.
Giả định
- Một biến thể combo luôn khai báo ít nhất một thành phần; một biến thể thường (không-combo) được một dòng combo tham chiếu là một lá vật lý.
- Chủ giữ đồ thị gói không-chu-trình và nông; rào chắn độ sâu, chu trình và combo rỗng là lưới an toàn, không phải chủ ý thiết kế.
11. Rủi ro & Câu hỏi Mở
| Rủi ro / câu hỏi | Giảm thiểu / trạng thái |
|---|---|
| Một combo cấu hình sai tham chiếu chính nó hoặc lồng quá sâu | Một bước nạp-trước có giới hạn + làm-phẳng lặp thực thi độ sâu tối đa cố định và phát hiện chu trình; việc thêm bị từ chối kèm lý do cụ thể |
| Một combo không có thành phần lọt tới giỏ | Combo rỗng bị từ chối khi bung; một biến thể combo cũng phải khai báo một thành phần khi tạo |
| Client can thiệp giá hoặc thành phần combo | Việc bung và kiểu / giá gói do máy chủ quyết, suy ra từ quan hệ đã lưu |
| Sửa trực tiếp dòng thành phần combo làm lệch combo | Dòng thành phần không sửa trực tiếp được; chủ sửa dòng dẫn và thành phần tự nhân theo |
| Một add-on miễn phí âm thầm bán quá tồn | Một add-on giữ chỗ tồn cho thành phần dù giá bằng không |
12. Kế hoạch Phát hành & Tiêu chí Ra mắt
| Khía cạnh | Kế hoạch |
|---|---|
| Giai đoạn | P2 - BND trong danh mục tính năng URD, cạnh VAR |
| Triển khai | Toàn bộ merchant; không feature flag |
| Di trú | Không - các dòng gói được tạo trên đường tạo-tổng-hợp biến thể hiện có |
| Tiêu chí ra mắt | Một combo thêm vào như dòng dẫn có giá cùng thành phần giá-không; số lượng thành phần nhân theo combo; combo vượt độ sâu, có chu trình và rỗng bị từ chối; add-on / FBT chỉ gắn vào một dòng dẫn cấp-cao nhất khớp; một combo không thể gắn như add-on |
| Giám sát | Tỷ lệ từ chối bung combo theo lý do (độ sâu, chu trình, rỗng), tỷ lệ gắn-lệch, nhất quán giá combo-vs-thành phần |
13. FAQ
Vì sao thành phần combo định giá bằng không? Vì bản thân combo mang giá. Dòng dẫn giữ fare của combo; thành phần ở đó để bếp làm và kho trừ tồn, không phải để tính tiền.
Điều gì xảy ra khi tôi thêm hai combo giống nhau? Mọi dòng thành phần nhân theo: số lượng một thành phần là lượng-mỗi-combo nhân số lượng combo. Cùng một thành phần đến qua nhiều nhánh được gộp vào một dòng với số lượng cộng dồn.
Một combo có chứa combo khác được không? Được - combo có thể lồng nhau. Việc bung đệ quy đến độ sâu cố định năm cấp; vượt mức đó, hoặc nếu chuỗi vòng lại chính nó, việc thêm bị từ chối kèm lý do cụ thể.
Add-on khác FBT thế nào? Một add-on luôn miễn phí và được gắn vào một dòng chủ. Một mục mua-kèm-thường-xuyên là một gợi ý có hướng mang giá riêng - hoặc một ghi-đè (cố định, phần trăm, theo-đơn-vị, hoặc bậc thang) - và được thêm khi biến thể kích hoạt nó được mua.
Tôi có thể gắn một combo vào dòng khác như add-on không? Không - combo được máy chủ bung thành dòng dẫn riêng và không thể gắn. Chỉ quan hệ add-on và FBT mới gắn vào một dòng dẫn cấp-cao nhất hiện có.
Tôi có thể sửa dòng thành phần của một combo trên đơn không? Không - thành phần không sửa trực tiếp được. Hãy sửa dòng dẫn combo và thành phần tự nhân theo.
Tham chiếu
- URD: Sản phẩm - BND · VAR · FAR
- PRD liên quan: Danh mục sản phẩm, biến thể & định danh · Tùy chọn sản phẩm & sinh biến thể · Hệ thống fare & định giá
- Module: Sản phẩm - tổng quan + năng lực
- Developer: @nx/commerce · @nx/core · Đơn hàng