Mở rộng giới hạn số từ khóa (hỗ trợ cài đặt theo cửa hàng)
Tổng quan
| Mục | Nội dung |
|---|---|
| Trạng thái | 🔵 Đề xuất |
| Issue | - |
| Phụ trách | - |
Nâng giới hạn số từ khóa đăng ký cho mỗi cửa hàng thành có thể tùy chỉnh theo từng cửa hàng hoặc từng hợp đồng, đồng thời mở rộng giới hạn cứng toàn hệ thống lên 15 từ khóa. Thiết kế đã tính đến việc tích hợp PlacesAPI và phương án tính phí tùy chọn theo từ khóa.
Nội dung đề xuất
Bối cảnh & vấn đề
- Giới hạn từ khóa hiện tại là 8 từ (DB không có ràng buộc, nhưng UI / Export / cấu trúc JSON đều giả định 8 từ)
- Khách hàng có nhu cầu theo dõi từ 10 từ khóa trở lên ngày càng nhiều
- Đang xem xét mô hình tính phí tùy chọn: ví dụ "thêm 1 từ khóa với phí ◯◯ yên/tháng"
- Tỷ lệ áp dụng dự kiến sẽ khác nhau theo cửa hàng — không phải toàn bộ cửa hàng đều tăng đồng loạt
- Hiện đang vận hành: scraping cho khoảng 33 cửa hàng, PlacesAPI cho khoảng 1.921 cửa hàng
→ Cần "giới hạn linh hoạt theo từng cửa hàng/hợp đồng" + "giới hạn cứng toàn hệ thống = 15"
Giải pháp đề xuất
Đặc điểm chính:
- Giới hạn cứng toàn hệ thống = 15 từ, tối thiểu = 8 từ (giữ nguyên cho hợp đồng hiện hữu)
- Mô hình dữ liệu hỗ trợ tính phí cả theo cửa hàng lẫn theo hợp đồng (sau này đổi đơn vị bán cũng không phải sửa DB)
- Thống nhất cấu trúc JSON sang khung 15 từ cho cả PlacesAPI / scraping / Laravel export
- Bổ sung UI cài đặt giới hạn theo cửa hàng trên màn quản trị, ghi ActivityLog làm cơ sở cho tính phí
- Tích hợp với nền tảng tính phí nằm ngoài phạm vi case này (release với cài đặt thủ công trước, tích hợp sẽ làm case sau)
Danh sách chức năng
| # | Tên chức năng | Mô tả | Ưu tiên |
|---|---|---|---|
| 1 | Tạo bảng cài đặt giới hạn | Lưu max_keywords theo cửa hàng/hợp đồng (kèm logic fallback) | Cao |
| 2 | UI quản trị (cho sales/CS) | Màn cài đặt giới hạn từ khóa theo cửa hàng + liên kết ActivityLog | Cao |
| 3 | Cải tạo UI khách hàng | Lấy giới hạn qua API, sinh ô nhập động | Cao |
| 4 | Validation phía backend | FormRequest đối chiếu với giới hạn theo cửa hàng | Cao |
| 5 | Cải tạo export_data PlacesAPI | Mở rộng cắt [:8] thành khung 15 từ | Cao |
| 6 | Cải tạo phía scraping | 3 chỗ: fill_export_data / mảng error / slice | Cao |
| 7 | Thống nhất quy cách CSV | Sắp xếp lại nhánh "以前のキーワード9〜N" | Trung bình |
| 8 | Cải tạo hiển thị ranking | Biểu đồ, bảng,… hỗ trợ số lượng linh hoạt | Trung bình |
| 9 | Xác nhận rate limit PlacesAPI | Cấu hình 3 key hiện tại (QPM 1800) có thể hấp thụ việc tăng lên 15 từ | Chỉ xác nhận |
Mock màn hình
キーワード管理
変更内容
| 項目 | 現行 | 変更後 |
|---|---|---|
| キーワード上限 | 8件 | 無制限(推奨10件以上) |
| スクレイピング | 8件固定 | 登録数に応じて動的 |
| 表示 | 固定レイアウト | スクロール対応 |
※ Mock màn cài đặt giới hạn theo cửa hàng cho admin sẽ bổ sung sau.
Các vấn đề thiết kế cần xem xét
Mô hình dữ liệu
Tạo bảng mới giữ giá trị giới hạn, hỗ trợ tính phí cả theo hợp đồng lẫn theo cửa hàng:
mappy_keyword_limit_settings
├─ id BIGINT PK
├─ scope_type ENUM('contract','location') -- Phạm vi áp dụng
├─ scope_id BIGINT -- user_id hoặc gbp_location_id
├─ system_id BIGINT
├─ max_keywords TINYINT UNSIGNED (8〜15)
├─ effective_from DATE
├─ effective_to DATE NULLABLE
├─ memo VARCHAR(255) -- Ghi chú của sales
└─ created_at / updated_atLogic tra cứu: cài đặt location → cài đặt contract → mặc định 8 (fallback theo thứ tự).
Ảnh hưởng phía PlacesAPI
- Mỗi location tăng từ 8 → 15 từ → lượng gọi API tăng +87%
- Cấu hình 3 GCP project key hiện tại (dung lượng QPM 1800) → QPM cần dùng 940, vẫn dư (không cần tăng project)
- Phí sử dụng: miễn phí với Basic SKU
- Thời gian xử lý: 200 giây → ~375 giây (batch ban đêm vẫn dư thời gian)
Ảnh hưởng phía scraping
- Chỉ còn ~33 cửa hàng → toàn bộ chuyển sang 15 từ cũng chỉ tăng thêm ~39 phút
- Số chỗ phải sửa hardcode chỉ có 3 (utils/search_ranking_process_aws.py)
Phương châm tích hợp hệ thống tính phí
mappy là hệ thống nhận thông báo thanh toán từ các nền tảng bên ngoài (KUCHIKOMIONE / G-COR / pipit), bản thân không có engine tính phí. Case này giới hạn phạm vi đến "có thể cài đặt thủ công trên màn quản trị", còn việc thêm SKU vào master sản phẩm và mở rộng payload thông báo phía nền tảng tính phí sẽ tách thành case sau.
Ước tính công (dựa trên AI)
Cơ cấu nhân sự
| Vai trò | Số người | Nội dung phụ trách |
|---|---|---|
| Thiết kế | 1 người | Xác nhận yêu cầu → Chỉ thị AI tạo tài liệu thiết kế → Review → Chỉ thị sản xuất |
| Sản xuất | 1 người | Chỉ thị AI tạo theo ISSUE → Code review → Kiểm thử → Deploy |
Chi tiết công
| # | Hạng mục công việc | Retry AI | Review | Công (người-ngày) | Phụ trách |
|---|---|---|---|---|---|
| 1 | Xác nhận yêu cầu & tạo tài liệu thiết kế | 2 lần | 0.5 ngày/lần | 1.0 | Thiết kế |
| 2 | Thiết kế DB & API (bao gồm bảng giới hạn) | 2 lần | 0.5 ngày/lần | 1.0 | Thiết kế |
| 3 | Tạo bảng giới hạn & migration | 1 lần | 0.5 ngày/lần | 0.5 | Sản xuất |
| 4 | UI quản trị (cài đặt giới hạn theo cửa hàng) | 3 lần | 0.5 ngày/lần | 2.0 | Sản xuất |
| 5 | Cải tạo UI khách hàng (lấy qua API, ô nhập động) | 2 lần | 0.5 ngày/lần | 1.0 | Sản xuất |
| 6 | Cải tạo validation & model | 1 lần | 0.5 ngày/lần | 0.5 | Sản xuất |
| 7 | Cải tạo export_data PlacesAPI | 1 lần | 0.5 ngày/lần | 0.5 | Sản xuất |
| 8 | Cải tạo phía scraping | 1 lần | 0.5 ngày/lần | 0.5 | Sản xuất |
| 9 | Thống nhất nhãn CSV & kiểm thử output | 2 lần | 0.5 ngày/lần | 1.0 | Sản xuất |
| 10 | Cải tạo hiển thị ranking | 2 lần | 0.5 ngày/lần | 1.0 | Sản xuất |
| 11 | Kiểm thử tích hợp | 2 lần | 0.5 ngày/lần | 1.5 | Sản xuất |
| 12 | Deploy & xác nhận hoạt động | 1 lần | 0.5 ngày/lần | 0.5 | Sản xuất |
| Tổng cộng | 11.0 |
Điều kiện tiên quyết & ràng buộc
- Giới hạn cứng = 15, tối thiểu = 8 (giữ nguyên cho hợp đồng hiện hữu)
- Tích hợp với nền tảng tính phí nằm ngoài phạm vi case này (release với cài đặt thủ công, tích hợp sẽ làm ở case sau)
- Cấu hình 3 key PlacesAPI hiện tại đủ hấp thụ lượng request tăng khi nâng lên 15 từ (không cần thêm project)
- Cần xác nhận lại ý nghĩa thật sự của nhãn CSV "以前のキーワード9〜N" (do typo hay dùng cho lưu lịch sử)
Lịch trình
| タスク | 担当 | 日数 | 5/25 | 5/26 | 5/27 | 5/28 | 5/29 | 5/30 | 5/31 | 6/1 | 6/2 | 6/3 | 6/4 | 6/5 | 6/6 | 6/7 | 6/8 | 6/9 | 6/10 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 月 | 火 | 水 | 木 | 金 | 土 | 日 | 月 | 火 | 水 | 木 | 金 | 土 | 日 | 月 | 火 | 水 | |||
| Xác nhận yêu cầu & tài liệu thiết kế | Thiết kế | 1d | |||||||||||||||||
| Thiết kế DB & API | Thiết kế | 1d | |||||||||||||||||
| Tạo bảng giới hạn & migration | Sản xuất | 1d | |||||||||||||||||
| Review thiết kế & chỉ thị sản xuất | Thiết kế | 1d | |||||||||||||||||
| UI quản trị | Sản xuất | 2d | |||||||||||||||||
| Cải tạo UI khách hàng | Sản xuất | 1d | |||||||||||||||||
| Cải tạo validation & model | Sản xuất | 1d | |||||||||||||||||
| Cải tạo PlacesAPI / scraping | Sản xuất | 1d | |||||||||||||||||
| Cải tạo CSV & hiển thị ranking | Sản xuất | 2d | |||||||||||||||||
| Kiểm thử tích hợp | Sản xuất | 2d | |||||||||||||||||
| Deploy & xác nhận hoạt động | Sản xuất | 1d |