quote_user_subscription_log_id
意義
quote_bids.quote_user_subscription_log_id 用來標記這筆 bid 是否已經有「聯絡 provider 時產生的扣款 / 使用紀錄」。
在目前 want_to_contact_provider 主線中,這個欄位會寫入 processWantToContactCharge() 產生的 transactions.id。
quote_bids.quote_user_subscription_log_id = transactions.id雖然欄位名稱有 subscription_log,但排查時不要只靠名稱推論成某張 subscription log table。實際要以當前程式與 transactions 為準。
什麼時候寫入
常見來源:
/quote_bids/want_to_contact_provider/{quote_bid_id}.jsonQuoteBid::processWantToContactProvider()
成功聯絡 provider 時,流程會先判斷這筆 bid 是否已經有扣款 / 使用紀錄。
判斷邏輯:
1. quote_bids.quote_user_subscription_log_id > 0
-> 視為已有紀錄
2. 若欄位沒有值,再查 transactions
class = QuoteBid
foreign_id = quote_bid_id
transaction_type_id = QuotePaymentForSubmissionAutoQuote
-> 找到也視為已有紀錄如果還沒有紀錄,才會進入扣款 / 建 transaction,並把 transaction id 回寫到:
quote_bids.quote_user_subscription_log_id與 is_want_to_contact_provider 的關係
這兩個欄位常一起看,但意義不同。
| 欄位 | 意義 |
|---|---|
is_want_to_contact_provider | consumer 是否正式聯絡 provider |
quote_user_subscription_log_id | 這次聯絡是否已綁定扣款 / 使用紀錄 |
成功 contact flow 常見結果:
is_want_to_contact_provider = 1
contact_provider_on = NOW()
is_paid_for_subscription = 1
quote_user_subscription_log_id = transactions.id但實務上仍要查 transactions,因為舊資料、特殊流程或既有 transaction 可能讓欄位與交易紀錄不是一眼就能對上。
與 transactions 的關係
auto quote contact 常見 transaction:
transactions.class = QuoteBid
transactions.foreign_id = quote_bids.id
transactions.transaction_type_id = 40其中:
40 = QuotePaymentForSubmissionAutoQuote常見情境:
| 情境 | transaction 狀態 |
|---|---|
| 月結 / auto quote debt | 可能先建 unpaid transaction |
| 錢包餘額足夠 | 可能直接 paid,real_pay_date 有值 |
| 信用卡 / auto refill | 可能先建 transaction,再執行後續 charge |
| 已聯絡過 | 不應重複建立新的 contact charge |
常用 SQL
查 bid 是否已有扣款 / 使用紀錄
SELECT
id,
quote_request_id,
provider_user_id,
is_want_to_contact_provider,
contact_provider_on,
is_paid_for_subscription,
total_site_fee,
quote_user_subscription_log_id,
reason
FROM quote_bids
WHERE id = <quote_bid_id>;用欄位回查 transaction
SELECT
id,
created,
user_id,
foreign_id,
class,
transaction_type_id,
amount,
real_pay_amount,
real_pay_date,
wallet_balance,
description
FROM transactions
WHERE id = <quote_user_subscription_log_id>;用 quote bid 回查所有相關 transactions
SELECT
id,
created,
user_id,
foreign_id,
class,
transaction_type_id,
amount,
real_pay_amount,
real_pay_date,
wallet_balance,
description
FROM transactions
WHERE class = 'QuoteBid'
AND foreign_id = <quote_bid_id>
ORDER BY id DESC;判斷是否已有 auto quote payment
SELECT
id,
created,
transaction_type_id,
amount,
real_pay_date
FROM transactions
WHERE class = 'QuoteBid'
AND foreign_id = <quote_bid_id>
AND transaction_type_id = 40
ORDER BY id DESC;排查重點
quote_user_subscription_log_id > 0通常代表已經有 contact charge / 使用紀錄,不應重複收費。- 欄位沒值不代表一定沒 transaction,還要查
transactions。 is_want_to_contact_provider = 1代表聯絡成立;quote_user_subscription_log_id是扣款 / 使用紀錄的線索。- 付款失敗時,先查 monolog
processWantToContactProvider,再回查transactions。 - 不要只看 API response 判斷金流結果。