### Bài toán (The Problem)

Kho hàng có hàng ngàn sản phẩm. Nếu theo Rule số 5 (Áo Polo -> Cần Quần Khaki), Magento có thể trả về 150 mẫu quần Khaki nam khác nhau. Nếu worker lưu cả 150 mẫu này cho 1 chiếc áo Polo:

- Bảng DB sẽ phình to khủng khiếp (Blowing up the database).
- Khách hàng bị ngợp, gợi ý thiếu tính cá nhân hóa và độ chính xác (Ngẫu nhiên hiện 5 quần Khaki xấu nhất).

## Worker Flow & Scoring Logic

1

### Trigger & Load Rule

CRON / EVENT

Worker nhận diện sản phẩm Anchor mới hoặc quét định kỳ. Đọc bảng `ai_outfit_rules` để lấy công thức.

// Input
Anchor: 8TS23S001 (Áo Polo Be)
Rule Loaded: ID 5 (Polo -> Khaki | Neutral+Dark)
2

### Hard-Filtering (Lọc Cứng)

SQL QUERY

Query trực tiếp vào CSDL sản phẩm (`magento_product...`) để lấy TẤT CẢ sản phẩm thỏa mãn điều kiện CƠ BẢN của Rule.

- Category = 'Quần Khaki'
- Gender = 'Male'
- Stock > 0

Kết quả ban đầu: 150 Sản phẩm
3

### Scoring System (Chấm Điểm & Xếp Hạng)

PYTHON LOGIC

Đây là trái tim của Worker. Chấm điểm 150 sản phẩm dựa trên các tiêu chí "Mềm" (Soft Rules) và Business Logic.

Color Harmony
Áo Be + Quần Xanh Than/Đen (+40đ). Áo Be + Quần Be (+10đ).
Business Value
Hàng mới về - New Season (+20đ). Bán chạy (+10đ).
Availability
Đủ > 4 sizes (+15đ). Chỉ còn 1 size (-20đ).
Action: Sắp xếp (Sort by Score DESC)
4

### Limiting & Persistence (Lưu Trữ)

SQL INSERT

Chỉ lấy TOP 3 - 5 sản phẩm có điểm số cao nhất để ghi vào DB.

Rank | Match Code | Score | AI Reason (Generated)
--- | --- | --- | ---
#1 | 8BK23S005 (Navy) | 85.5 | Màu Xanh Than tương phản hoàn hảo với màu Be. Đủ size.
#2 | 8BK23S012 (Đen) | 75.0 | Quần Khaki đen cơ bản, dễ mặc, hợp môi trường công sở.
#3 | 8BK23S001 (Xám) | 60.0 | Tone xám trung tính, an toàn và thanh lịch.

## Khi Chatbot / API gọi (The Runtime)

Lúc khách hàng xem áo Polo `8TS23S001`, Chatbot KHÔNG CẦN CHẠY AI MATCHING nữa. Nó chỉ cần query:

    SELECT match_product_code, match_role, ai_reason
    FROM pg__dashboard_canifa__ai_outfit_product_matches
    WHERE anchor_product_code = '8TS23S001'
    ORDER BY id ASC; -- Đã được Worker sort sẵn lúc insert

Độ trễ: < 10ms (Không cần gọi LLM, hoàn toàn là Database Lookup).