# PRD — EPIC-002: Panel Tự Động Nhận Nhiệm Vụ Mới

**Epic:** EPIC-002
**Phiên bản:** 1.2
**Ngày:** 2026-05-15
**Giải pháp:** Thuần frontend — web tự reload trang sau 30 giây + nút reload thủ công (cooldown 10s). Không thay đổi API.

---

## 1. Problem & Goal

**Problem:** Panel của công nhân không tự cập nhật khi tổ trưởng giao Ticket mới. Công nhân phải tự reload — nhưng tại xưởng không ai làm vậy, dẫn đến trễ 10–30 phút giữa "giao nhiệm vụ" và "bắt đầu thực hiện".

**Goal:**
- Panel tự reload sau mỗi 30 giây → ticket mới xuất hiện mà không cần thao tác
- Công nhân có thể chủ động reload ngay qua nút "Làm mới"

---

## 2. User Flows

### Happy Path — Nhận ticket tự động

1. Tổ trưởng assign Ticket cho công nhân A
2. Panel công nhân A đang mở → sau tối đa 30 giây, trang tự reload
3. Ticket mới xuất hiện trong danh sách

### Happy Path — Công nhân chủ động reload

1. Công nhân nhấn nút "Làm mới"
2. Trang reload ngay lập tức
3. Nút disable trong 10 giây (hiển thị đếm ngược), sau đó enable trở lại

### Error Path — Mạng lỗi khi reload

1. Trang reload thất bại → hiển thị lỗi mặc định của trình duyệt hoặc trang lỗi
2. Timer tiếp tục chạy; 30 giây sau thử reload lại
3. Công nhân cũng có thể nhấn nút "Làm mới" để thử lại (sau cooldown)

---

## 3. Acceptance Criteria

**EPIC-002-AC01** (Must)
- **Given** công nhân đang mở panel
- **When** 30 giây trôi qua kể từ lần load gần nhất
- **Then** trang tự reload, danh sách ticket hiển thị dữ liệu mới nhất

**EPIC-002-AC02** (Must)
- **Given** công nhân đang xem panel
- **When** nhấn nút "Làm mới"
- **Then** trang reload ngay lập tức (không chờ hết 30s)

**EPIC-002-AC03** (Must)
- **Given** công nhân vừa nhấn "Làm mới"
- **When** trong vòng 10 giây tiếp theo
- **Then** nút ở trạng thái disabled, hiển thị đếm ngược (VD: "Làm mới (8s)")

**EPIC-002-AC04** (Must)
- **Given** nút đang đếm ngược cooldown
- **When** đếm về 0
- **Then** nút trở về trạng thái enabled

**EPIC-002-AC05** (Should)
- **Given** công nhân đang nhập liệu hoặc đang thực hiện thao tác trên trang
- **When** đến lúc auto-reload
- **Then** trang vẫn reload bình thường (không có exception cho interaction đang dở)

---

## 4. UI / Design

### Nút "Làm mới"

- Đặt tại header panel, dễ thấy trên tablet
- State **enabled**: label "Làm mới", có thể nhấn
- State **loading** (đang reload): spinner nhỏ, disabled
- State **cooldown**: label "Làm mới (Xs)", disabled, đếm ngược mỗi giây
- Kích thước đủ lớn để tap trên màn hình cảm ứng (≥ 44×44px)

### Indicator thời gian

```
┌──────────────────────────────────────────────────────┐
│  NHIỆM VỤ CỦA TÔI        Cập nhật: 12s trước  [Làm mới]  │
└──────────────────────────────────────────────────────┘
```

- "Cập nhật: Xs trước" — đếm lên từ lần load gần nhất; reset về 0 sau mỗi reload
- Giúp công nhân biết dữ liệu còn mới không

---

## 5. Non-Functional Requirements

**Performance:** Reload interval 30 giây là đủ với nghiệp vụ xưởng. Không có yêu cầu latency dưới 30 giây.

**Không ảnh hưởng API:** Giải pháp này là page reload thông thường — server không cần thay đổi gì.

---

## 6. Dependencies

Không có dependency mới. Giải pháp chỉ thay đổi `web-kingston` — thêm auto-reload timer và nút "Làm mới" vào Worker Panel page.

---

## 7. Rollout

**Direct rollout** — deploy web-kingston. Không cần deploy api-kingston. Không cần feature flag.

**Smoke test:** Mở panel → đợi 30 giây → xác nhận trang reload. Nhấn nút → xác nhận cooldown 10s.

**Revert:** Deploy lại web-kingston phiên bản trước nếu có vấn đề.

---

## Links

- Epic: [[docs/epics/EPIC-002/EPIC-002|EPIC-002]]
- Domain: [[topics/phan-mem/api-kingston-mes|MES Architecture]]
