Quote Bid 列表價格與手動報價折扣

文件狀態:初版。
最後驗證日期:2026-05-20。

一句話結論

找新客戶列表上的 限時6折 / 限時8折 不是列表 API 即時計算的。列表只讀 quote_requests.manual_fee_discount

manual_fee_discount後端文字畫面常見文字
1.0000空字串不顯示折扣
0.80008折限時8折
0.60006折限時6折

一般 TW 案件的 0.8 / 0.6 由 cron 後補:

cron_list_7/Lib/ETL/adjust_request_fee.php

本地若沒有跑 cron_list_7/DataMart/main.php,不會自動折價。

相關入口

列表 API

GET /quote_bids/index/type:myworks/page:{page}/page_size:{page_size}/filter_id:{filter_id}/category_ids:[].json

主要程式:

pro360_api_82/Endpoint/V1/QuoteBids.php::index_myworks()
pro360_api_82/Lib/Lang/LangLogicZHTW.php::getDiscount()

折價 cron

cron_list_7/Lib/ETL/adjust_request_fee.php
cron_list_7/DataMart/main.php

初始價格計算

pro360_api_82/Lib/SearchAdd/RequestFeeUpdater.php
pro360_api_82/Lib/QuoteRequestCopy/CopyRequestFeeUpdater.php
get-lancer-php56/app/Plugin/Quotes/Model/QuoteRequest.php::updateRequestVariableFee()

列表顯示規則

列表顯示的價格主要看:

QuoteRequest.manual_fee

列表顯示的折扣文字主要看:

QuoteRequest.manual_fee_discount_text

後端產生 manual_fee_discount_text 的規則:

QuoteRequest.manual_fee_discount
-> LangLogicZHTW::getDiscount()
-> 6折 / 8折 / 空字串

限時 不是 API 欄位,通常是前端文案。

欄位對照

response 欄位用途
QuoteBid.total_site_feebid 建立時的基準平台費;列表中常可視為折扣前手動報價 fee
QuoteRequest.manual_fee列表顯示價格;通常已套用 manual_fee_discount
QuoteRequest.manual_fee_discount折扣倍率,決定 6 折 / 8 折文字
QuoteRequest.manual_fee_discount_text後端轉出的折扣文字
QuoteCategoriesQuoteSubscriptionType.indirect_feeresponse 中常鏡射 QuoteRequest.manual_fee

常見對應:

QuoteRequest.manual_fee = round(QuoteBid.total_site_fee * QuoteRequest.manual_fee_discount)

例子:

QuoteBid.total_site_fee = 175
QuoteRequest.manual_fee_discount = 0.6000
QuoteRequest.manual_fee = 105
 
175 * 0.6 = 105
QuoteBid.total_site_fee = 173
QuoteRequest.manual_fee_discount = 0.8000
QuoteRequest.manual_fee = 138
 
173 * 0.8 = 138.4,取整後為 138

6 折 / 8 折怎麼產生

基本條件

adjust_request_fee.php 只處理符合下列條件的 request:

r.id > 600
r.sent_count > 10
r.is_notification_mail_sent = 1
r.manual_fee > 0
r.is_closed = 0
r.is_archived = 0
r.is_allow_contact_charge = 0
r.match_type != 7

折價條件

案件年齡互動條件原本折扣新折扣額外動作
24-48 小時quote_bid_count = 0auto_quote_contact_count = 010.8可能塞 rematch task
48-72 小時quote_bid_count + auto_quote_contact_count <= 110.8
72-144 小時quote_bid_count + auto_quote_contact_count <= 10.80.6

白話規則:

建立超過 24 小時,仍沒人報價 / 沒 auto contact -> 8折
建立超過 48 小時,報價 + auto contact 不超過 1 -> 8折
已經 8折,建立超過 72 小時且報價 + auto contact 不超過 1 -> 6折

折價時更新哪些欄位

折價時會更新:

quote_requests.manual_fee_discount
quote_requests.manual_fee
quote_requests.contact_charge_fee
quote_requests.site_fee
quote_requests.original_contact_charge_fee

計算方式:

manual_fee_discount = 0.8 或 0.6
manual_fee = round((目前 manual_fee / 目前 manual_fee_discount) * 新 discount)
contact_charge_fee = round(original_contact_charge_fee * 新 discount)
contact_charge_fee 最低 75
site_fee = manual_fee

第一次從 manual_fee_discount = 1 進入折扣時,會先記錄:

original_contact_charge_fee = contact_charge_fee

每次變更會寫 log:

quote_request_fee_change_logs

Rematch 行為

只有 24-48 小時進 8 折那條有 rematch = true

額外條件:

contact_charge_quote_count = 0
quote_request_counters.new_leads_count 不存在或等於 0

符合時會塞:

task_queue.action = rematchQuoteRequest

7 天後恢復價格

同一支 cron 會把 7 天後、45 天內的折扣案恢復原價。

條件:

r.created < current_timestamp - interval 7 day
r.created > current_timestamp - interval 45 day
manual_fee_discount < 1

恢復時計算:

manual_fee_discount = 1
manual_fee = round(manual_fee / 舊 manual_fee_discount)
site_fee = manual_fee
contact_charge_fee = original_contact_charge_fee,若 original_contact_charge_fee > 0

同樣會寫:

quote_request_fee_change_logs

初始價格怎麼產生

manual_fee_discount 的 6/8 折主要由 cron 後補;但 manual_fee 的初始價格來自另一條 fee 計算流程。

大致順序:

quote_categories_quote_subscription_types
-> category 基礎費用
-> quote_form_fields variable fee,若命中則覆寫基礎費
-> quote_fee_adjust_campaigns,若命中 manual campaign 則覆寫 manual fee
-> quote_group_variable_fees,若命中 group variable fee 則覆寫 manual fee
-> quote_categories.fee_discounts,依表單答案乘上 fee multiplier
-> booking user / area special case
-> 寫回 quote_requests

主要寫回欄位:

quote_requests.site_fee
quote_requests.manual_fee
quote_requests.auto_fee
quote_requests.direct_fee
quote_requests.contact_charge_fee
quote_requests.original_contact_charge_fee

fee_discounts 的邊界

quote_categories.fee_discounts 可以解釋初始 fee 如何依表單答案被乘上倍率。

資料形狀:

category_id
-> quote_form_field_id
-> option title
-> manual_fee / auto_fee / contact_charge_fee multiplier

但它不是列表 manual_fee_discount_text 的主要來源。列表顯示 6/8 折主要看 cron 寫入的:

quote_requests.manual_fee_discount

cron 是否啟用

cron_list_7/crontab.txt 有每分鐘執行範例:

cd /home/ubuntu/cron_list_7/DataMart/; php main.php

DataMart/main.php 會查:

pro360_data_mart.etl_status

條件:

run_sys_ver != 'php8'
executable = 1
current_timestamp + interval 8 hour >= last_timestamp

然後依 etl_status.name 動態執行:

\PRO360\ETL\{name}

所以要確認 adjust_request_fee 是否實際跑,要看該環境:

是否有啟動 cron_list_7/DataMart/main.php
pro360_data_mart.etl_status 是否有 name = adjust_request_fee
該 row 是否 executable = 1
period / last_timestamp 是否到期

本地目前沒有啟用時,不會自動折價。

不是這些來源

項目判讀
filter_id:8只是列表篩選,不會造成 6/8 折
列表 API 查詢只讀既有欄位,不即時計算折扣
quote_categories.fee_discounts影響初始 fee multiplier,但不是 manual_fee_discount_text 主來源
one day discount notify主要是通知已折扣案件
auto quote 720 小時規則屬於 auto/contact preview 特殊 fee,和列表 6/8 折不同

排查順序

  1. 看 API response 的 QuoteRequest.manual_fee_discountmanual_fee_discount_text
  2. 對照 QuoteBid.total_site_feeQuoteRequest.manual_fee 是否符合倍率。
  3. quote_requestsmanual_fee_discountmanual_feecontact_charge_feeoriginal_contact_charge_fee
  4. quote_request_fee_change_logs,確認是否由 cron 調整。
  5. 若要查初始 fee,回查 category fee、variable fee、campaign、group variable fee、fee_discounts 與表單答案。
  6. 若要確認 cron,查該環境的 crontab 與 pro360_data_mart.etl_status

相關文件