QuoteServiceCategories Add 與 Edit

文件狀態:已實測
最後驗證:2026-07-23
來源:legacy code / new API code / PHPUnit / legacy access log / DB baseline

這份文件回答什麼

說明 provider 替既有 quote_service 加入 category 時,quote_service_categories/addquote_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 比較

比較項目AddEdit
用途快速掛上 category 並建立初始設定儲存完整 category 設定
API/add/quote_service_id:{id}/quote_category_id:{id}.json/edit/.json/edit/{qsc_id}.json
ID 來源service/category 都在 URLcreate 時在 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
Responseraw QSC rowgetFormatData() 格式化結果
成功欄位error/message/dataerror/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