narrow_status_id

意義

quote_bids.narrow_status_id 表示 narrow match 邀請狀態。

這個欄位主要用來判斷 consumer 是否已經邀請某個 narrow match provider 報價,以及 provider 後續是否接受 / 拒絕。

常見值:

0 = NOT_SEND,尚未送出邀請
1 = WAITING,已送出邀請,等待 provider 回覆
2 = ACCEPTED,provider 接受
3 = REJECTED,provider 拒絕

什麼時候改變

由 NOT_SEND 變 WAITING

常見來源:

POST /quote_bids/consumer_want_provider_quote/{quote_bid_id}.json

成功後代表 consumer 已邀請這位 narrow match provider 報價。

常見一起更新:

quote_bids.narrow_status_id = WAITING
quote_bids.is_contact_charge = 0
quote_bids.reason = <reason>
quote_bids.requestor_note = <preserve_note 或 reserve note>

如果 provider 原本先選擇不感興趣,也可能一起改:

quote_bids.is_interested = 1
quote_bids.quote_status_id = Send
quote_bids.provider_status_id = Send

由 WAITING 變 ACCEPTED / REJECTED

通常是 provider 後續回應 narrow match invitation 的流程。

這段要搭配 provider 端 API / 狀態流程看,不能只看 consumer 發邀請的 API。

與 is_want_to_contact_provider 的差異

narrow_status_idis_want_to_contact_provider 代表不同主線。

欄位意義常見流程
narrow_status_idnarrow match 邀請狀態consumer_want_provider_quote
is_want_to_contact_providerconsumer 是否正式聯絡 providerwant_to_contact_provider

不要用 is_want_to_contact_provider = 1 判斷 consumer_want_provider_quote 是否成功。這支 API 成功主狀態是:

narrow_status_id = WAITING

成功前 Guard

consumer_want_provider_quote 成功前會要求:

quote_bids.is_narrow_match = 1
quote_bids.narrow_status_id = NOT_SEND
quote_bids.quote_status_id IN (Send, NotInterested)

如果 narrow_status_id 已不是 NOT_SEND,通常代表已送過邀請,不應重複送。

與聯繫上限的關係

同一個 request 的聯繫 / 邀請數會把 narrow match 算進去:

SELECT
  COUNT(id) AS contact_or_invite_count
FROM quote_bids
WHERE quote_request_id = <quote_request_id>
  AND (
    (is_auto_quote = 1 AND is_want_to_contact_provider = 1)
    OR narrow_status_id IN (1, 2, 3)
  );

也就是說:

  • auto quote 正式聯絡:看 is_want_to_contact_provider = 1
  • narrow match 邀請 / 回應:看 narrow_status_id IN (1, 2, 3)

兩者會一起算入上限。

Activity 規則

consumer 成功送出 narrow match 邀請時會建立:

quote_activities.quote_activity_type_id = WantProviderQuote
quote_activities.secondary_foreign_id = quote_bid_id

這和 want_to_contact_provider 成功時常見的 AutoQuoteContact activity 不同。

常用 SQL

查 narrow match 狀態

SELECT
  qb.id,
  qb.quote_request_id,
  qr.user_id AS requestor_user_id,
  qb.provider_user_id,
  qb.quote_service_id,
  qb.is_narrow_match,
  qb.narrow_status_id,
  qb.quote_status_id,
  qb.provider_status_id,
  qb.is_interested,
  qb.is_contact_charge,
  qb.is_want_to_contact_provider,
  qb.reason,
  qb.requestor_note
FROM quote_bids qb
INNER JOIN quote_requests qr ON qr.id = qb.quote_request_id
WHERE qb.id = <quote_bid_id>;

查同 request 的 narrow match bids

SELECT
  id,
  quote_request_id,
  provider_user_id,
  quote_service_id,
  quote_status_id,
  provider_status_id,
  is_narrow_match,
  narrow_status_id,
  reason,
  requestor_note
FROM quote_bids
WHERE quote_request_id = <quote_request_id>
  AND is_narrow_match = 1
ORDER BY id DESC;

查 WantProviderQuote 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;

排查重點

  • narrow_status_id = 0 才能送出新的 narrow match invitation。
  • narrow_status_id = 1 代表 consumer 已邀請,正在等 provider 回覆。
  • consumer_want_provider_quote 成功不代表已正式聯絡扣款。
  • 若要確認 consumer 是否正式聯絡 provider,要看 is_want_to_contact_providercontact_provider_on
  • 若要確認 provider 是否已收到 narrow invitation,要看 WantProviderQuote activity 與通知 queue / queue log。