Skip to main content

聊天列表

聊天列表分為一般聊天室列表和服務號聊天室列表。 一般聊天列表常態顯示;服務號列表是否顯示需根據服務號聊天室數據決定。 若有滿足如下條件的服務號聊天室數據,服務號列表才可顯示:

  1. 服務號是啓用狀態;
  2. 當前用戶是服務號成員;
  3. 如果是商務號,當前用戶不是商務號的擁有者

列表數據

聊天列表需要按照聊天室類型及其他條件區分其顯示在一般聊天列表還是顯示在服務號聊天列表。 目前在用的聊天室類型:

個人:person
系統:system
好友:friend
多人:discuss
社團:group
服務號:services
服務號成員:serviceMember
其他請參考server設定。

需要隱藏的聊天室

當有聊天室被刪除後,不要在列表顯示;當聊天室從聊天列表移除後,沒有新的數據變化,不要在列表顯示;當用戶非該聊天室成員時,不要在列表顯示。

  1. 關聯欄位
  • dfrTime : 從聊天列表移除時,會更新
  • deleted : 聊天室被刪除時會更新
  • member_deleted : 被移除成員會更新
  1. 隱藏條件
  • 有dfrTime
    • 有lastMessage, dfrTime > lastMessage的sendTime
    • 無lastMessage, dfrTime > 0
  • 無dfrTime
    • deleted(聊天室被刪除、多人或者社團被解散等)、member_deleted(非聊天室成員)

一般聊天列表上的聊天室

  • 服務號 聊天室類型的:

    • 屬於臨時成員聊天室
      • provisionalIds包含自己
  • 訂閱服務號聊天室

    • ownerId是自己
  • 我為商務號擁有者的進線聊天室,服務狀態非機器人服務

    • serviceNumberType是"Boss"
    • serviceNumberOwnerId是"自己"
    • serviceNumberStatus不是"robotService"
  • 服務號成員 聊天室類型的:

    • 屬於商務號,且我是服務號成員,也是是商務號擁有者
  • 其他所有類型聊天室

服務號聊天列表上的數據

  • 服務號 聊天室類型的:
    • 我為商務號擁有者的進線聊天室,服務狀態是機器人服務
      • serviceNumberType是"Boss"
      • serviceNumberOwnerId是"自己"
      • serviceNumberStatus是"robotService";
    • 不是訂閱服務號,且我非臨時成員
      • ownerId不是自己且provisionalIds不包含自己;
  • 服務號成員 聊天室類型的:
    • 我是服務號成員,且如是商務號我不能是商務號擁有者;

API

  • base/sync/label 同步標籤數據,可以過濾出我的最愛;
  • base/sync/contact 同步客戶數據;
  • base/sync/employee 同步員工數據
  • base/sync/subscribe/servicenumber 同步所有訂閱服務號數據;
  • base/sync/servicenumber 同步服務號數據
  • base/sync/room/unread 同步未讀的聊天室
  • chat/room/servicenumber/active/list 查詢進線中和機器人服務中的聊天室記錄
  • chat/room/robotservice/list 租戶下正在進行機器人服務的聊天室
  • base/sync/room/normal 一般聊天列表資料
  • base/sync/room/servicenumber 服務號聊天資料

未讀數

未讀數分訊息未讀統計、標記未讀。

  1. 當聊天室有未讀訊息時,未讀訊息數會被統計;
  2. 當對一個聊天室做標記未讀時,未讀數為1;
  3. 有未讀的聊天室不能被標記未讀;有新的未讀訊息時,應取消標記未讀;
  4. 統計未讀數時,標記未讀數也要被統計;
  5. 標記未讀是本地操作,不會被同步,故某些情景下做比照時會有差異;

未讀數的取值

  • 聊天室有未讀數時,取聊天室未讀數
  • 聊天室無未讀數時,如果是被標記未讀的,則未讀數為1
    • 聊天室更新未讀數時,如果未讀數大於0,則刪除標記未讀的狀態

未讀角標顯示

  • 未讀數 > 0

    • 如果有@我的未讀訊息(未讀訊息中有@我、@ALL),聊天室未讀角標顯示為「@+未讀數」,如: @11;
    • 否則:
      • 是系統聊天室,顯示N;
      • 不是,則只顯示未讀。
  • 未讀數不大於0,

    • 如果是要顯示N的聊天室,則角標顯示為N;

‼️注意:

  1. 在聊天列表,如果需要顯示的未讀數超過99,則數字部分顯示為99+
  2. 未讀數統計時,需要過濾無效的(不能被顯示的)聊天室
  3. 分組的聊天室在分組收起時要合併計算分組下的所有聊天室的未讀數作為未讀角標
  4. 標記未讀數不會被同步
  5. 顯示N的聊天室:
    • 是系統聊天室,顯示N;
    • 聊天室是服務號類型的且服務號是商務號,且我(當前用戶)是商務號擁有者、未讀數為0;
      • 服務狀態是online的;
      • 服務狀態是offline、timeout, 但不是商務號擁有者結束服務的。

分組

一般聊天列表

一般聊天列表暫無分組;

服務號聊天列表

服務號聊天列表有兩種排序規則對應不同的分組方式

  1. 分組方式
    • 按分組排的分組方式
      • AI服務
      • 監控AI
      • 剛進件
      • 我服務中
      • 服務中
      • 服務號1
      • 服務號2
      • 服務號...
    • 按時間排的分組方式
      • AI服務
      • 監控AI
      • 剛進件
      • 我服務中
      • 服務中
      • 其他

無論依哪種方式排序,都會有 AI服務、監控AI、剛進件、我服務中、服務中 這些分組,這些屬於共有分組。其他未在分組內的聊天室數據則按照當前的排序規則分組。 當這些分組的某個分組內沒有數據時,則不需要顯示這個分組。

  1. 分組規則

共有部分:

  • AI服務
    • 服務號聊天室服務狀態是AI服務中,且聊天室未告警;
  • 監控AI
    • 服務號聊天室服務狀態是AI服務中,且聊天室告警;
  • 剛進件
    • 無服務人員,服務狀態是online的;
    • 無服務人員,服務狀態是timeout但有未讀的;
  • 我服務中
    • 有服務人員,且是我
      • 服務狀態是online,屬於專業服務號的;
      • 服務狀態是offline,但被標記未讀的;
      • 服務狀態是timeout,被標記未讀的或屬於專業服務號有未讀數的;
    • 有服務人員,且不是我
      • 服務狀態是offline,且聊天室有未讀並被標記未讀的;
      • 服務狀態是timeout,且被標記未讀的聊天室;
    • 無服務人員
      • 服務狀態是offline或timeout,被標記未讀的;
  • 服務中
    • 有服務人員,且是我
      • 服務狀態是online,且非專業服務號的聊天室;
      • 服務狀態是timeout,且非專業服務號有未讀數但不是標記未讀的聊天室;
    • 有服務人員,且不是我
      • 服務狀態是online的聊天室;
      • 服務狀態是timeout的,有未讀但不是標記未讀的聊天室;

‼️ 因為服務號列表目前沒有標記未讀功能, 所以排除原始的有關標記未讀的判斷條件

非共有部分按排序決定的分組:

  • 列表按分組進行排序時
    • 按服務號歸類分組,分組名為服務號名稱
  • 列表按時間進行排序時
    • 其他
      • 非共有分組的數據全部歸入其他分組

ℹ️ 通過 serviceNumberAgentId 是否有值來判段是否有服務人員

排序

一般聊天列表排序

  1. 先按照時間做逆序(desc)排序
    1. 時間計算規則
      • 有未讀時:取最新訊息發送時間;
      • 無未讀時:取最新訊息發送時間與最新交互時間中最大的;
    2. 交互時間更新規則
      • 發送訊息時(如:發送、分享、回復等),取當前時間更新交互時間;
      • 刪除訊息時,取刪除後的最新一筆訊息的時間作為交互時間;如果聊天室沒有訊息了,則交互時間設為0;
      • 從聯絡人列表打開夥伴聊天室(是好友)、服務號、社團聊天室,取當前時間更新交互時間;
      • 打開聊天室時,如果有未讀,則取當前時間更新交互時間;
  2. 再按照權重分數做逆序(desc)排序
    1. 權重分數

      • 未讀:256
      • 顯示N:128
      • 釘選:64
      • 我的最愛(我收藏的聊天室):32
      • @我:16
      • 物件聊天室: 8
      • 物件主聊天室:4
      • 有發送失敗的訊息:2
      • 有草稿訊息:1
    2. 分數加權計算規則

      • 初始分數為0;
      • 顯示N的商務號進線聊天室,+128
        • 聊天室是服務號類型的且服務號是商務號,且我(當前用戶)是商務號擁有者、未讀數為0;
          • 服務狀態是online的
          • 服務狀態是offline、timeout, 但不是商務號擁有者結束服務的
      • 聊天室有未讀或有被標記未讀,+256
      • 聊天室被釘選且釘選時間大於0,+64
      • 是我的最愛(收藏的),且有未讀訊息,+32
      • 未讀訊息用有@我或者@ALL的,+16
      • 有發送失敗的訊息,+2
      • 有草稿訊息,+1

服務號聊天列表排序

  1. 先按照時間做逆序(desc)排序
    • 時間取聊天室交互時間和最新訊息時間之間最大的值;
  2. 共有分組順序固定
  3. 其他按照當前排序規則排序
    • 依分組排序時
      • 先將分組按名稱做升序(asc)排序(按字母大小寫順序)
      • 再將聊天室數據依次放入各自對應的服務號分組里
    • 依時間排序時
      • 將共共有分組外的組外的數據全部依次放入其他分其他分組中;

交互功能

釘選

釘選指釘選聊天室,通常被釘選的聊天室會出現在聊天列表的頂部,但受其他排序規則影響也會出現在其他位置(如:釘選聊天室沒有未讀,會排在有未讀的聊天室下面)

  • 只能在一般聊天列表做釘選、取消釘選操作;
  • 釘選相關欄位
    • isTop:布爾值,是否釘選;
    • topTime:釘選時間,主要用於同為釘選的排序依據;
  • 釘選的聊天室需要顯示釘選標識;
  • 只有被釘選的聊天室才可以執行取消釘選;
  • 釘選操作會同步,收到相關的通知的客戶端需要更新聊天列表數據;

API

  • chat/room/top 釘選
  • chat/room/top/cancel 取消釘選

NoticeEvent

  • Ce.Notice.TopRoom 釘選
  • Ce.Notice.CancelTopRoom 取消釘選
  • 收到notice後更新列表數據

靜音(提醒)

默認所有的聊天室都是提醒的(不靜音),體現為新訊息會響鈴、訊息會被推送。如果聊天室被設置了不提醒(靜音),則該聊天室有新訊息不會響鈴,且客戶端也不會收到推送訊息。

  • 首先server需要啓用聊天室的提醒功能,客戶端才可以做相關操作或顯示相關操作入口
  • 臨時成員聊天室不能顯示、使用該功能
  • 相關欄位
    • isMute: 布爾值,是否靜音

API

  • chat/room/mute 靜音
  • chat/room/mute/cancel 取消靜音

NoticeEvent

  • Ce.Notice.Room.Mute 聊天室靜音事件
  • 收到notice後更新列表數據

標記未讀

標記未讀,指的是對一個沒有未讀數的聊天室做標記未讀,使得它的未讀數變為1,起到提醒、關注的作用。

  • 有未讀、已標記未讀的聊天室,不能顯示、使用該功能;
  • 有新未讀訊息時,標記未讀記號要清除;
  • 標記未讀只在本地處理,數據不會同步;

已讀

已讀,指的是對聊天室做訊息已讀操作。如果聊天室是標記未讀,則取消標記未讀記錄;如果聊天室有未讀訊息,則需要調用聊天室已讀API,清除未讀數、未讀標記。

  • 只有聊天室有未讀數時,才可以顯示、使用該功能;

API

  • chat/message/v2/read

NoticeEvent

  • Ce.Notice.ReadAndReceived
  • 收到notice需要更新列表數據。

刪除

刪除,指的是將聊天室從聊天列表移除,並不是刪除聊天室。目的在於希望清理不常用的聊天列表數據、移除不關心的某個聊天室,這些聊天室在有新訊息或者新的交互發生時會再次出現在聊天列表上。

  • 個人聊天室不能被從列表移除
  • 臨時成員聊天室不能被從列表移除
  • 我非聊天室成員的聊天室不能被從列表移除
  • 移除聊天室更新欄位dfrTime

API

  • chat/room/recent/delete

For Mobile

團隊未讀消息提醒列表

一個用戶可以有多個團隊,當用戶的其他團隊有未讀團隊有未讀訊息時,需要顯示團隊未讀提醒列表,包含團隊基本信息和未讀未讀數。

  • 非當前團隊有未讀時,需要可以顯示團隊未讀提醒列表,它在一般聊天列表頁面,通過下拉來顯示;
  • 通過CP服務的通知或團隊列表的請求數據來監控團隊未讀數;

網絡狀態檢測提醒

當網當網絡狀況不佳時,需要在一般聊天列表顯示網絡狀態提醒橫幅。

  • 只在一般列表顯示;
  • 可以常態監控,也可只在socket斷開、重連時監測,然後在正常後取消監測,主要取決於對效能的考量(如耗電量)