# Order Service

> Điều phối đơn hàng với Strategy Pattern cho thương mại đa ngành.

## Tổng Quan

Order Service là "bộ não" của nền tảng, điều phối đơn hàng qua nhiều ngành dọc sử dụng **Strategy Pattern**. Service này định tuyến từng dòng hàng đến vertical engine phù hợp (Inventory, Booking, F&B Engine) dựa trên loại sản phẩm.

### Tính Năng Chính

- **Strategy Pattern** - Định tuyến đơn hàng theo loại sản phẩm không dùng if-else
- **Đơn hàng Hybrid** - Một đơn với nhiều loại mặt hàng (Physical + Service + Food)
- **Điều phối Transaction** - Luồng Validate → Pay → Execute
- **Event-Driven** - Phát integration events cho các service downstream

## Bối Cảnh Kiến Trúc

```mermaid
graph TB
    POS["POS / Web"] --> ORDER["📝 Order Service"]
    ORDER --> CATALOG["📦 Catalog Service"]
    ORDER --> MERCHANT["🏪 Merchant Service"]
    ORDER --> WALLET["💰 Wallet Service"]
    ORDER --> INVENTORY["🏭 Inventory Service"]
    ORDER --> BOOKING["📅 Booking Service"]
    ORDER --> FNB["🍳 F&B Engine"]
    
    style ORDER fill:#e74c3c,stroke:#c0392b,color:#fff
```

## Yêu Cầu

| Yêu cầu | Phiên bản |
|---------|-----------|
| .NET SDK | 10.0.101+ |
| Docker | 24.0+ |
| PostgreSQL | 15+ |
| RabbitMQ | 3.12+ |

## Bắt Đầu Nhanh

```bash
cd services/order-service-net
cp .env.example .env
dotnet restore
dotnet run --project src/OrderService.API
```

## Cấu Trúc Dự Án

```
order-service-net/
├── src/
│   ├── OrderService.API/
│   │   ├── Application/
│   │   │   ├── Strategies/          # Các chiến lược dòng hàng
│   │   │   ├── Commands/            # CreateOrder, CancelOrder
│   │   │   └── Queries/             # GetOrder, ListOrders
│   │   └── Controllers/
│   ├── OrderService.Domain/
│   │   ├── AggregatesModel/
│   │   │   └── OrderAggregate/      # Order, OrderItem
│   │   └── Events/
│   └── OrderService.Infrastructure/
└── tests/
```

## API Endpoints

| Method | Endpoint | Mô tả |
|--------|----------|-------|
| `POST` | `/api/v1/orders` | Tạo đơn hàng |
| `GET` | `/api/v1/orders/{id}` | Chi tiết đơn hàng |
| `GET` | `/api/v1/orders` | Danh sách đơn hàng theo shop |
| `POST` | `/api/v1/orders/{id}/pay` | Xử lý thanh toán |
| `POST` | `/api/v1/orders/{id}/cancel` | Hủy đơn hàng |
| `PATCH` | `/api/v1/orders/{id}/items/{itemId}/status` | Cập nhật trạng thái item |

## Strategy Pattern

### ILineItemStrategy Interface

```csharp
public interface ILineItemStrategy
{
    ProductType SupportedType { get; }
    Task ValidateAsync(OrderItem item, Guid shopId);
    Task ExecuteAsync(OrderItem item, Guid shopId);
}
```

### Các Strategies Có Sẵn

| Strategy | Product Type | Service Đích |
|----------|--------------|--------------|
| `RetailStrategy` | Physical | Inventory Service |
| `ServiceStrategy` | Service | Booking Service |
| `FnbStrategy` | PreparedFood | F&B Engine |

### Luồng Xử Lý Đơn Hàng

```mermaid
sequenceDiagram
    participant POS
    participant Order as Order Service
    participant Catalog as Catalog Service
    participant Strategy as Strategy Factory
    participant Target as Target Service

    POS->>Order: Tạo Đơn Hàng
    Order->>Catalog: Lấy Loại Sản Phẩm
    
    loop Mỗi Dòng Hàng
        Order->>Strategy: Lấy Strategy theo Loại
        Strategy->>Target: Validate
        Target-->>Strategy: OK
    end
    
    Order->>Order: Xử Lý Thanh Toán
    
    loop Mỗi Dòng Hàng
        Order->>Strategy: Lấy Strategy theo Loại
        Strategy->>Target: Execute
    end
    
    Order-->>POS: Đơn Hàng Hoàn Tất
```

## Domain Model

### Order Aggregate

```csharp
public class Order : Entity, IAggregateRoot
{
    public Guid ShopId { get; private set; }
    public Guid? CustomerId { get; private set; }
    public OrderStatus Status { get; private set; }
    public decimal TotalAmount { get; private set; }
    
    private readonly List<OrderItem> _items;
    public IReadOnlyCollection<OrderItem> Items => _items.AsReadOnly();
    
    public void AddItem(Product product, int quantity);
    public void MarkAsPaid();
    public void Cancel(string reason);
}
```

## Integration Events

| Event | Trigger | Subscribers |
|-------|---------|-------------|
| `OrderCreatedEvent` | Đặt đơn hàng | Analytics |
| `OrderPaidEvent` | Thanh toán thành công | Wallet, Notification |
| `OrderCancelledEvent` | Hủy đơn hàng | Inventory (rollback) |
| `KitchenTicketCreatedEvent` | Thêm món F&B | F&B Engine |

## Services Liên Quan

- [Catalog Service](../../catalog-service-net/docs/vi/README.md) - Dữ liệu sản phẩm
- [Inventory Service](../../inventory-service-net/docs/vi/README.md) - Quản lý tồn kho
- [Booking Service](../../booking-service-net/docs/vi/README.md) - Lịch hẹn
- [F&B Engine](../../fnb-engine-net/docs/vi/README.md) - Hiển thị bếp

## Tài Nguyên

- [Kiến Trúc Đa Ngành Hàng](../../../../docs/vi/architecture/multi-vertical-architecture.md)
- [Strategy Pattern](https://refactoring.guru/design-patterns/strategy)

## License

Proprietary - GoodGo Platform
