Skip to content

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ụcNộ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ăngMô tảƯu tiên
1Tạo bảng cài đặt giới hạnLưu max_keywords theo cửa hàng/hợp đồng (kèm logic fallback)Cao
2UI 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 ActivityLogCao
3Cải tạo UI khách hàngLấy giới hạn qua API, sinh ô nhập độngCao
4Validation phía backendFormRequest đối chiếu với giới hạn theo cửa hàngCao
5Cải tạo export_data PlacesAPIMở rộng cắt [:8] thành khung 15 từCao
6Cải tạo phía scraping3 chỗ: fill_export_data / mảng error / sliceCao
7Thống nhất quy cách CSVSắp xếp lại nhánh "以前のキーワード9〜N"Trung bình
8Cải tạo hiển thị rankingBiểu đồ, bảng,… hỗ trợ số lượng linh hoạtTrung bình
9Xác nhận rate limit PlacesAPICấ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 / 8件
1MEO対策
2美容室 渋谷
3ヘアサロン
4カット 安い
5縮毛矯正
6トリートメント
7ヘッドスパ
8カラー 渋谷
上限に達しています。上限撤廃モードを有効にしてください。

変更内容

項目現行変更後
キーワード上限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_at

Logic 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ườiNội dung phụ trách
Thiết kế1 ngườiXá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ất1 ngườiChỉ thị AI tạo theo ISSUE → Code review → Kiểm thử → Deploy

Chi tiết công

#Hạng mục công việcRetry AIReviewCông (người-ngày)Phụ trách
1Xác nhận yêu cầu & tạo tài liệu thiết kế2 lần0.5 ngày/lần1.0Thiết kế
2Thiết kế DB & API (bao gồm bảng giới hạn)2 lần0.5 ngày/lần1.0Thiết kế
3Tạo bảng giới hạn & migration1 lần0.5 ngày/lần0.5Sản xuất
4UI quản trị (cài đặt giới hạn theo cửa hàng)3 lần0.5 ngày/lần2.0Sản xuất
5Cải tạo UI khách hàng (lấy qua API, ô nhập động)2 lần0.5 ngày/lần1.0Sản xuất
6Cải tạo validation & model1 lần0.5 ngày/lần0.5Sản xuất
7Cải tạo export_data PlacesAPI1 lần0.5 ngày/lần0.5Sản xuất
8Cải tạo phía scraping1 lần0.5 ngày/lần0.5Sản xuất
9Thống nhất nhãn CSV & kiểm thử output2 lần0.5 ngày/lần1.0Sản xuất
10Cải tạo hiển thị ranking2 lần0.5 ngày/lần1.0Sản xuất
11Kiểm thử tích hợp2 lần0.5 ngày/lần1.5Sản xuất
12Deploy & xác nhận hoạt động1 lần0.5 ngày/lần0.5Sản xuất
Tổng cộng11.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/255/265/275/285/295/305/316/16/26/36/46/56/66/76/86/96/10
Xác nhận yêu cầu & tài liệu thiết kếThiết kế1d
Thiết kế DB & APIThiết kế1d
Tạo bảng giới hạn & migrationSản xuất1d
Review thiết kế & chỉ thị sản xuấtThiết kế1d
UI quản trịSản xuất2d
Cải tạo UI khách hàngSản xuất1d
Cải tạo validation & modelSản xuất1d
Cải tạo PlacesAPI / scrapingSản xuất1d
Cải tạo CSV & hiển thị rankingSản xuất2d
Kiểm thử tích hợpSản xuất2d
Deploy & xác nhận hoạt độngSản xuất1d