is_want_to_contact_provider

意義

quote_bids.is_want_to_contact_provider 表示 consumer 是否已正式聯絡這個 provider。

0 = 尚未正式聯絡 provider
1 = 已正式聯絡 provider

這不是單純的 UI flag。它通常代表 consumer 已經從「看 quote card」進入「正式洽談 / 可聊天 / 可能扣款」狀態。

常見狀態轉換

由 0 變 1

常見來源:

  • /quote_bids/want_to_contact_provider/{quote_bid_id}.json
  • SearchAdd/AuthorizedContactProcessor
  • SearchAdd/DirectReserveProcessor
  • SearchAdd/DirectUserProcessor
  • preserve / direct contact 類流程

成功轉換時通常一起寫:

quote_bids.contact_provider_on = NOW()
quote_bids.is_paid_for_subscription = 1
quote_bids.is_interested = 1
quote_requests.auto_quote_contact_count + 1

並可能建立:

  • transactions
  • quote_activities.AutoQuoteContact
  • task_event_queue.bid_contact_count
  • task_event_queue.sent_contact_provider_sms
  • messages

維持 0

常見原因:

  • consumer 只是看到 quote card,還沒聯絡。
  • message 被分類為 rejectedinsignificant
  • provider 不可聯絡。
  • 付款 / 扣款失敗。
  • quote request 已關閉、封存或過期。

want_to_contact_provider 的特殊規則

如果 request 有帶 message,會先分類。

例如:

message = 哈囉
classes = insignificant
response = {"error":17,"status":""}

這種情境:

  • message 仍可能寫入 messages
  • message activity 仍可能寫入 quote_activities
  • 但不會進入正式聯絡主線
  • is_want_to_contact_provider 應維持 0

如果 message 可接受:

message = 我要聯絡
classes = not-reject
response = {"status":"success","error":0}

這種情境才會進入 contact flow,將 is_want_to_contact_provider 改成 1。

Activity 規則

成功聯絡 provider 時會建立 AutoQuoteContact activity。

legacy 非 narrow match 規則:

quote_activity_type_id = AutoQuoteContact
param1 = NULL
param2 = reason

例如:

reason = SEND_MESSAGE
param1 = NULL
param2 = SEND_MESSAGE

不要把 param1 = search_add_contact 當成 legacy 預期。那是修正前曾出現過的不一致結果。

常用 SQL

查 bid 聯絡狀態

SELECT
  qb.id,
  qb.quote_request_id,
  qr.user_id AS requestor_user_id,
  qb.provider_user_id,
  qb.quote_service_id,
  qb.is_auto_quote,
  qb.is_contact_charge,
  qb.is_want_to_contact_provider,
  qb.contact_provider_on,
  qb.reason,
  qb.total_site_fee,
  qb.quote_user_subscription_log_id,
  qr.auto_quote_contact_count
FROM quote_bids qb
INNER JOIN quote_requests qr ON qr.id = qb.quote_request_id
WHERE qb.id = <quote_bid_id>;

查聯絡 activity

SELECT
  id,
  created,
  quote_activity_type_id,
  provider_user_id,
  requestor_user_id,
  receiver_user_id,
  model,
  foreign_id,
  secondary_model,
  secondary_foreign_id,
  param1,
  param2
FROM quote_activities
WHERE secondary_foreign_id = <quote_bid_id>
ORDER BY id DESC
LIMIT 20;

查分類結果

SELECT
  id,
  quote_bid_id,
  message,
  model_version,
  classes,
  params,
  created
FROM quote_bid_classify_contacts
WHERE quote_bid_id = <quote_bid_id>
ORDER BY id DESC
LIMIT 10;

查 transaction

SELECT
  id,
  created,
  user_id,
  foreign_id,
  class,
  transaction_type_id,
  amount,
  real_pay_date,
  wallet_balance
FROM transactions
WHERE foreign_id = <quote_bid_id>
  AND class = 'QuoteBid'
ORDER BY id DESC;

排查重點

  • is_want_to_contact_provider = 1 才代表正式聯絡成立。
  • 有 message 不代表正式聯絡成立。
  • 有 message activity 不代表正式聯絡成立。
  • AutoQuoteContact activity 才比較接近 contact flow 成功,但仍要搭配 quote_bids 與 transaction 看。
  • queue 驗證要同時查 task_event_queuetask_event_queue_log