# KẾ HOẠCH PHÁT TRIỂN TÍNH NĂNG ĐỊNH VỊ LỘ TRÌNH (AGENT SPECIFICATION) ## 1. Phân Tích Trạng Thái Giao Diện Hiện Tại (Context Analysis) * **Màn hình**: Tour Dashboard (Tên tour người dùng tự đặt khi tạo tour mới). * **Tab Active**: Lộ trình (Mặc định). * **Sub-view Active**: Bản đồ (Component bản đồ đang hiển thị ở nửa dưới màn hình). * **Thành phần cần can thiệp**: Lớp tương tác (Interaction Layer) của thư viện Bản đồ (Mapbox / Google Maps API / Leaflet) đang render phía dưới. ## 2. Đặc Tả Kỹ Thuật Đóng Gói (Functional Requirements) ### 2.1. Quản lý Trạng thái Thực thể (Data State Management) Agent cần ánh xạ sự kiện trên UI vào hai trường dữ liệu trong Database Schema: * **Điểm xuất phát (StartLocation)**: Ánh xạ vào Location đầu tiên của Tour với sequence: 0 hoặc cấu hình tọa độ trực tiếp vào cấu trúc metadata của Tour. * **Điểm kết thúc (EndLocation)**: Ánh xạ vào Location cuối cùng của Tour hoặc trường đích của Tour. ### 2.2. Chi Tiết Bản Ghép Logic Sự Kiện (Event Mapping) | Thao tác Người dùng | Trình kích hoạt (Trigger) | Hành động Hệ thống (System Action) | Phản hồi Giao diện (UI Feedback) | | :--- | :--- | :--- | :--- | | **Xác định Điểm xuất phát** | - Tìm kiếm trên Map Search Box
- Hoặc Right-Click (Desktop)
- Hoặc Long-Press (Mobile) | 1. Trích xuất tọa độ (lat, lng).
2. Gọi API khởi tạo điểm đầu.
3. Cập nhật nhãn "Điểm xuất phát:..." trên Top Banner. | Tạo 1 Ghim (Marker) Màu Xanh Blue tại tọa độ được chọn. | | **Xác định Điểm kết thúc** | - Tìm kiếm trên Map Search Box
- Hoặc Right-Click (Desktop)
- Hoặc Long-Press (Mobile) | 1. Trích xuất tọa độ (lat, lng).
2. Gọi API khởi tạo điểm cuối.
3. Cập nhật nhãn "Điểm kết thúc:..." trên Top Banner. | Tạo 1 Ghim (Marker) Màu Xanh Green tại tọa độ được chọn. | ## 3. Kiến Trúc Mã Nguồn Gợi Ý Cho AI Agent (Pseudocode / Implementation Guide) Agent cần triển khai component bản đồ với cấu trúc xử lý sự kiện (Context Menu) như sau: ### 3.1. Cấu trúc Menu Ngữ Cảnh (Custom Context Menu Component) Khi sự kiện click chuột phải/nhấn giữ xảy ra, lấy ra tọa độ (lat, lng) của điểm chạm và hiển thị menu pop-up tại vị trí con trỏ: ```typescript interface ContextMenuProps { x: number; // Tọa độ pixel trên màn hình y: number; latLng: { lat: number; lng: number }; onSelectStart: (latLng: { lat: number; lng: number }) => void; onSelectEnd: (latLng: { lat: number; lng: number }) => void; } ``` ### 3.2. Thuật toán xử lý ghim (Marker Rendering Logic) Mô tả logic bằng mã giả để Agent tiến hành sinh code xử lý: ```javascript // Trạng thái lưu trữ tọa độ trên Frontend const [startCoords, setStartCoords] = useState(null); const [endCoords, setEndCoords] = useState(null); // Hàm xử lý khi chọn "Bắt đầu từ đây" function handleSetStartPoint(latLng) { // 1. Cập nhật state để render ghim Blue setStartCoords(latLng); // 2. Gọi API cập nhật Database thông qua UUID của Tour hiện tại API.updateTourStartPoint(tourId, { latitude: latLng.lat, longitude: latLng.lng, locationType: 'START' }); // 3. Render Marker Blue lên Bản đồ map.renderMarker({ position: latLng, icon: 'blue-pin.png', label: 'S' }); } // Hàm xử lý khi chọn "Kết thúc ở đây" function handleSetEndPoint(latLng) { // 1. Cập nhật state để render ghim Green setEndCoords(latLng); // 2. Gọi API cập nhật Database API.updateTourEndPoint(tourId, { latitude: latLng.lat, longitude: latLng.lng, locationType: 'END' }); // 3. Render Marker Green lên Bản đồ map.renderMarker({ position: latLng, icon: 'green-pin.png', label: 'E' }); } ```