Quote Bid 列表價格與手動報價折扣
文件狀態:初版。
最後驗證日期:2026-05-20。
一句話結論
找新客戶列表上的 限時6折 / 限時8折 不是列表 API 即時計算的。列表只讀 quote_requests.manual_fee_discount:
manual_fee_discount | 後端文字 | 畫面常見文字 |
|---|---|---|
1.0000 | 空字串 | 不顯示折扣 |
0.8000 | 8折 | 限時8折 |
0.6000 | 6折 | 限時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_fee | bid 建立時的基準平台費;列表中常可視為折扣前手動報價 fee |
QuoteRequest.manual_fee | 列表顯示價格;通常已套用 manual_fee_discount |
QuoteRequest.manual_fee_discount | 折扣倍率,決定 6 折 / 8 折文字 |
QuoteRequest.manual_fee_discount_text | 後端轉出的折扣文字 |
QuoteCategoriesQuoteSubscriptionType.indirect_fee | response 中常鏡射 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 = 105QuoteBid.total_site_fee = 173
QuoteRequest.manual_fee_discount = 0.8000
QuoteRequest.manual_fee = 138
173 * 0.8 = 138.4,取整後為 1386 折 / 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 = 0 且 auto_quote_contact_count = 0 | 1 | 0.8 | 可能塞 rematch task |
| 48-72 小時 | quote_bid_count + auto_quote_contact_count <= 1 | 1 | 0.8 | 無 |
| 72-144 小時 | quote_bid_count + auto_quote_contact_count <= 1 | 0.8 | 0.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_logsRematch 行為
只有 24-48 小時進 8 折那條有 rematch = true。
額外條件:
contact_charge_quote_count = 0
quote_request_counters.new_leads_count 不存在或等於 0符合時會塞:
task_queue.action = rematchQuoteRequest7 天後恢復價格
同一支 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_feefee_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_discountcron 是否啟用
cron_list_7/crontab.txt 有每分鐘執行範例:
cd /home/ubuntu/cron_list_7/DataMart/; php main.phpDataMart/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 折不同 |
排查順序
- 看 API response 的
QuoteRequest.manual_fee_discount與manual_fee_discount_text。 - 對照
QuoteBid.total_site_fee與QuoteRequest.manual_fee是否符合倍率。 - 查
quote_requests的manual_fee_discount、manual_fee、contact_charge_fee、original_contact_charge_fee。 - 查
quote_request_fee_change_logs,確認是否由 cron 調整。 - 若要查初始 fee,回查 category fee、variable fee、campaign、group variable fee、
fee_discounts與表單答案。 - 若要確認 cron,查該環境的 crontab 與
pro360_data_mart.etl_status。