Product & BOM / Aggregates / bom-aggregate.html
Manufacturing Core

BOM Aggregate

Đặc tả chi tiết ranh giới giao dịch Định mức vật tư (BOM) và quy trình định tuyến sản xuất (Routing) tại xưởng Kingston.

📐 Cấu Trúc Thành Phần BOM

BOM Aggregate quản lý danh sách nguyên vật liệu cấu thành và quy trình công nghệ Routing để sản xuất sản phẩm hoàn thiện.

BOM (Định mức) AGGREGATE ROOT BomComponent SNAPSHOT ENTITY (1 - N) BomWorkStep ROUTING ENTITY (1 - N)

📸 Cơ Chế Khóa Cứng Dữ Liệu (Snapshot BOM)

Tại sao cần phải chụp Snapshot khi duyệt Định mức?

Trong nhà máy Kingston, các kỹ sư R&D liên tục cập nhật bản vẽ vật lý của ProductComponent. Nếu Lệnh sản xuất trực tiếp tham chiếu tới Product của R&D, bất kỳ cập nhật bản vẽ nào ở R&D cũng sẽ làm thay đổi thông số định mức của các lệnh đang sản xuất dở dang tại xưởng, gây ra sai lệch nghiêm trọng về số lượng cấp phát vật tư WIP.

💡 Quy tắc giao dịch: Khi BOM được phê duyệt (status chuyển sang APPROVED), hệ thống bắt buộc phải sao chép toàn bộ thông tin tĩnh của Component vật lý sang BomComponent. Thực thể BomComponent hoạt động như một Snapshot lịch sử tĩnh, khóa cứng thông số định mức sản xuất độc lập với R&D.

⚙️ Luật Định Tuyến Công Nghệ (Routing Rules)

Ràng buộc toàn vẹn của chuỗi các bước công đoạn sản xuất (BomWorkStep).

  • Luật 1 (Quan hệ tuần tự):

    Mỗi bước công đoạn BomWorkStep phải thiết lập thuộc tính dependsOnStepIds để xác định công đoạn trước đó bắt buộc phải hoàn thành (ví dụ: công đoạn "Sơn phủ nhôm" chỉ được bắt đầu sau khi hoàn tất công đoạn "Hàn khung gá").

  • Luật 2 (Công đoạn kết thúc):

    Bắt buộc phải có duy nhất một công đoạn được đánh dấu là isLastStep = true (thường là Đóng gói hoặc QC xuất xưởng). Đây là tín hiệu để hệ thống Production Execution tạo phiếu báo cáo hoàn thành Bán thành phẩm (WIP) nhập kho.

  • Luật 3 (Chống vòng lặp kín):

    Mối quan hệ phụ thuộc công nghệ giữa các bước Routing bắt buộc phải tạo thành đồ thị có hướng không chu trình (DAG - Directed Acyclic Graph). Cấm tuyệt đối cấu hình vòng lặp vô tận (ví dụ: Bước 1 phụ thuộc Bước 2, Bước 2 phụ thuộc Bước 1).

💻 Cấu Trúc Khai Báo Model (TypeScript / NestJS Context)

Đoạn code định nghĩa Domain Entity của BOM phục vụ AI định vị và lập trình chính xác logic nghiệp vụ.

// src/product-management/domain/models/bom.model.ts
export class BOM {
  private id: string;
  private variantId: string;
  private status: BomStatus;
  private bomComponents: BomComponent[];
  private routingSteps: BomWorkStep[];

  // Thực hiện snapshot dữ liệu khi duyệt BOM
  public approve(activeComponents: Component[]): void {
    if (this.bomComponents.length === 0) {
      // Thực hiện ánh xạ tĩnh sang BomComponent Snapshot
      this.bomComponents = activeComponents.map(comp => 
        new BomComponent(comp.getId(), comp.getCode(), comp.getQuantity())
      );
    }
    this.status = BomStatus.APPROVED;
  }
}