Skip to content

Architecture

1. Bối cảnh hệ thống (C4 L1)

Pricing thuần đồng bộ trên đường read/calculate (sale gọi nó inline lúc checkout). Input async duy nhất là luồng CDC ProductVariant tự seed fare.

2. Góc nhìn Container (C4 L2)

3. Góc nhìn Component (C4 L3) — Phân lớp nội bộ

LớpTrách nhiệm
Routes12 base path trong RestPaths (một — pricing-configurations — khai báo, không controller mount)
ControllersCổng auth (jwt, basic), permission theo resource, ánh xạ DTO
Calculation servicesToán fare/tax stateless; v1 flat, v2 snapshot
Management servicesCRUD + transaction aggregate
RepositoriesTruy vấn Drizzle, soft-delete, denormalize counter
WorkerNạp CDC, seed fare idempotent

4. Chỉ mục máy trạng thái

EntityTrạng tháiSơ đồ
FareSetACTIVATED, DEACTIVATED
FareACTIVATED, DEACTIVATED, ARCHIVED
Tax / TaxSet / TaxTypeACTIVATED, DEACTIVATED, ARCHIVED
PromotionDRAFT, ACTIVATED, DEACTIVATED, ARCHIVED

FareSet

FareSetStatuses.canDeactivate() luôn trả false — một FareSet đã activated là terminal-active. Đúng một FareSet ACTIVATED mỗi variant là bất biến chọn lựa.

Fare

Tax / TaxSet / TaxType

Cả ba chia sẻ IGNIS Statuses.{ACTIVATED, DEACTIVATED, ARCHIVED}. Tax calculator chỉ đọc hàng ACTIVATED trong cửa sổ hiệu lực.

Promotion

Promotion hiện chỉ CRUD — không calculator nào tiêu thụ chúng, nên trạng thái chưa có hiệu ứng định giá.

5. Kịch bản runtime

5.1 Định giá Checkout (v2 snapshot)

BướcChi tiết
2–7Theo dòng: chọn fare (DEFAULT/OVERRIDE/POLICY), rồi thuế kép gom theo priority
8Order snapshot tổng hợp ledger byBearer theo dòng + rule cấp order
9–10Sale lưu snapshot bất biến; pricing không giữ trạng thái order

5.2 ProductVariant CDC → Seed Fare

BướcChi tiết
4Chỉ xử lý CREATE/RETRIEVE; UPDATE/DELETE là no-op
5Bỏ qua khi đã có FareSet cho variant (idempotent)
6FBT bundlers seed một OVERRIDE child mang orderProductVariantIds CONTAINS leadVariantId

5.3 Variant đồng bộ — Deep Copy FareSet

Khi một variant mang metadata.referenceId, worker deep-copy toàn bộ cấu trúc fare của variant tham chiếu trong một transaction thay vì seed một default tươi.

6. Mối quan tâm xuyên suốt

Mối quan tâmCách service này xử lý
AuthNJWT (ES256, JWKS từ identity); BASIC cho service-to-service (sale dùng BASIC)
AuthZCasbin qua PolicyDefinition; theo resource mỗi controller; permission cache trong Redis
i18njsonb { default, en, vi } trên cột name / description
LoggingIGNIS có cấu trúc (key: %s); decorator @logged(); marker SKIP/DONE trong worker
Moneyfloat(x, 4) khắp nơi; số tiền lưu decimal(15,4), serialize thành chuỗi (MoneySchema)
IdempotencyCDC worker bỏ qua khi FareSet/FBT override đã seed; endpoint calculate không side-effect
StatelessnessPricing không lưu order/snapshot; snapshot nó trả về thuộc về caller
Soft-deleteSoftDeletableRepository (deletedAt); filter mặc định deletedAt IS NULL
IDsSnowflake qua IdGenerator, worker 7

7. Trang liên quan

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