QuoteServiceCategories Add 與 Edit
文件狀態:已實測
最後驗證:2026-07-23
來源:legacy code / new API code / PHPUnit / legacy access log / DB baseline
這份文件回答什麼
說明 provider 替既有 quote_service 加入 category 時,quote_service_categories/add 與 quote_service_categories/edit 的用途與行為差異。
這裡只保留長期穩定的流程差異;migration commit、單次測試 ID、流量與 staging diff 請看 API 路由與遷移/API Migration/pro360_api_82/api_migration/details/quote_service_categories/。
核心關係
quote_services
└── quote_service_categories
└── 每個 category 的接案偏好、服務地區、價格、預算與自動報價設定add 不是新增 quote_services,而是替既有 service 建立一筆 category 初始設定。
Add 與 Edit 比較
| 比較項目 | Add | Edit |
|---|---|---|
| 用途 | 快速掛上 category 並建立初始設定 | 儲存完整 category 設定 |
| API | /add/quote_service_id:{id}/quote_category_id:{id}.json | /edit/.json 或 /edit/{qsc_id}.json |
| ID 來源 | service/category 都在 URL | create 時在 body;update 的 QSC ID 在 URL |
| Request body | 不作為初始設定來源 | 是主要資料來源 |
| 可否建立 QSC | 可以 | /edit/.json 也可以 |
| 可否更新既有 QSC | 不會更新 | 可以 |
| Duplicate | 回既有 row,不修改 | 找到既有 row 後繼續更新 |
| Service area | 從 service 自動複製 | 使用 request 傳入值 |
| Job preference | 自動選取 category 全部預設選項 | 使用 request 傳入並驗證 |
| Travel preference | 使用 category 預設 | 使用 request,並依 category 規則正規化 |
| Pricing | 不從 body 寫入 | 可以更新 |
| Budget | 不從 body 寫入 | 可以更新並可能回 pending |
| Auto quote | 不處理 | 可以開關、檢查資格並寫 log |
| Direct reserve | 不處理 | 可以開關並檢查資格 |
| Description | 不處理 | 可以更新並觸發 content review |
| Response | raw QSC row | getFormatData() 格式化結果 |
| 成功欄位 | error/message/data | error/status/data/is_budget_update_pending |
| Top-level ID | 沒有;ID 在 QSC row | 只有 create path 回 top-level id |
最容易混淆的地方
edit/.json 也能建立 QSC,因此不能只記成「add 是新增、edit 是修改」。比較準確的理解是:
add
= 使用 service/category 自動建立預設 QSC
edit/.json
= 使用 client 傳入的完整設定建立 QSC
edit/{id}.json
= 修改既有 QSC兩者最後共用 QuoteServiceCategory::validateSave(),但 duplicate 行為不同:
Add wrapper
→ validateSave(..., is_return_exist_id=true)
→ 已存在時 rollback 前置暫存寫入,回傳既有 ID
Edit
→ validateSave(..., is_return_exist_id=false)
→ 已存在時繼續套用 request 設定程式查詢入口
- New endpoint:
pro360_api_82/Endpoint/V1/QuoteServiceCategories.php - New route:
pro360_api_82/Lib/Common/RouterRule/Mapping.php - New model:
pro360_api_82/Lib/Model/QuoteServiceCategory.php - Legacy controller:
get-lancer-php56/app/Plugin/Quotes/Controller/QuoteServiceCategoriesController.php - Legacy model:
get-lancer-php56/app/Plugin/Quotes/Model/QuoteServiceCategory.php
涉及 DB 查詢時,使用容器 PHP 8.2 + DBFactory;先 SHOW COLUMNS,再執行 SELECT。