Aile 聊天室類型完整規格說明書

版本: v1.0\ 最後更新: 2026-06-13\ 服務核心: aile-service-room(策略工廠模式)


1. 概述

Aile 系統採用策略工廠模式(Strategy Factory Pattern)管理 12 種聊天室類型。每種類型由一個獨立的 RoomStrategy 實現類處理,透過 @Component(RoomType.XXX) 註冊到 RoomFactory.strategyMap,執行時依 RoomModel.type 動態分發。

1.1 架構設計


    
    
    
  RoomFactory.strategyMap  (Map<type, RoomStrategy>)
  │
  ├── person        → PersonRoomImpl
  ├── accountPerson → AccountPersonRoomImpl
  ├── friend        → FriendRoomImpl
  ├── group         → GroupRoomImpl
  ├── discuss       → DiscussRoomImpl
  ├── services      → ServiceRoomImpl
  ├── serviceMember → ServiceMemberRoomImpl
  ├── business      → BusinessRoomImpl
  ├── aileSystem    → AileSystemRoomImpl
  ├── aiwowSystem   → AiwowSystemRoomImpl
  ├── system        → SystemRoomImpl
  └── lineGroup     → LineGroupRoomImpl

2. RoomModel(聊天室通用模型)

MongoDB 集合:aile.room


    
    
    
  @Document("aile.room")
public
 class RoomModel extends BaseModel {
    String name;                // 聊天室名稱
    String type;                // 聊天室類型(12 種之一)
    String tenantId;            // 租戶 ID
    String accountId;           // 帳號 ID(創建者)
    String ownerId;             // 擁有者 ID
    Boolean isCustomName;       // 是否自定義名稱
    String avatarId;            // 頭像 ID
    String serviceNumberId;     // 服務號 ID(服務號相關聊天室使用)
    Boolean isExternal;         // 服務號是否對外
    Long lastSequence;          // 最後消息序號
    RoomStatus status;          // 聊天室狀態
    MessageVO lastMessage;      // 最後一條消息快照
    String homePagePicId;       // 首頁背景圖 ID
    // 物件(Business)相關

    String businessId;          // 業務物件 ID
    String businessName;        // 物件名稱
    BusinessStatus businessStatus; // 物件狀態
    String businessDescription; // 物件描述
    Long businessEndTime;       // 物件結束時間
    Long businessCompleteTime;  // 物件完成時間
    String mainRoomId;          // 主聊天室 ID(Business 子房用)
    String mergeTargetRoomId;   // 合併目標聊天室 ID(Saga 合併後使用)
    String lineGroupId;         // LINE 群組 ID(LineGroup 專用)
}

2.1 RoomStatus(聊天室狀態)

狀態說明
Enable正常啟用
Disable被禁用(附禁用時長)
Delete已刪除(軟刪除)
Danger不安全,有風險
Complaint被檢舉
Forbid被禁言
Block被封鎖

2.2 BusinessStatus(物件狀態,Business 類聊天室使用)

狀態說明
Pending尚未開始
Progress進行中
Revision返回修改
Complete已完成

3. 12 種聊天室類型詳解

3.1 person — 個人聊天室

屬性
策略實現PersonRoomImpl
成員範圍僅創建者本人
用途個人筆記、草稿、待辦提醒、系統通知收納
isMulti
isAccountRoom

設計意圖: 每個 Account 有一個 person 聊天室(AccountModel.personRoomId 指向),用於系統向該帳號推送個人化消息。

消息發送規則: 僅向房間內的所有成員(即本人)發送。


3.2 accountPerson — 帳號個人聊天室

屬性
策略實現AccountPersonRoomImpl
成員範圍僅帳號本人
用途跨租戶的帳號級系統通知(如生態邀請、系統公告)
isMulti
isAccountRoom

設計意圖:person 更上層的帳號級聊天室,不依附於任何租戶。用於 Aile 生態級系統消息。


3.3 friend — 好友聊天室

屬性
策略實現FriendRoomImpl
成員範圍2 人
用途員工之間的一對一私聊
isMulti
isAccountRoom

設計意圖: 租戶內部兩位員工之間的私聊頻道。固定雙人,不可擴充成員。


3.4 group — 群組聊天室

屬性
策略實現GroupRoomImpl
成員範圍多人(≥3)
用途員工群聊
isMulti
isAccountRoom

設計意圖: 租戶內部的多人工作群聊。支援 @提及、群公告等功能。


3.5 discuss — 討論聊天室

屬性
策略實現DiscussRoomImpl
成員範圍多人
用途主題討論
isMulti
isAccountRoom

設計意圖: 以特定主題或文件為中心的討論空間。與 group 的區別在於更偏重非同步討論,可附屬於某個主題/任務。


3.6 services — 客服聊天室

屬性
策略實現ServiceRoomImpl
成員範圍客戶 + 服務號 + 客服人員
用途客戶與服務號的私聊客服通道
isMulti
isAccountRoom

設計意圖: 這是 Aile 最核心的聊天室類型。每當客戶透過 LINE / WhatsApp 等渠道聯繫服務號時,系統自動建立一個 services 聊天室。

關鍵行為:

成員構成(MemberGroupType):

分組說明
ServiceAgent當前接待客服
ServiceOwner服務號 Owner
ServiceMember服務號管理成員
ProvisionalMember臨時加入的內部成員
ProvisionalCustomer外部客戶

3.7 serviceMember — 服務號成員聊天室

屬性
策略實現ServiceMemberRoomImpl
成員範圍服務號內部成員
用途服務號客服之間的內部溝通
isMulti
isAccountRoom

設計意圖: 每個服務號自動建立一個內部群聊,該服務號的所有客服成員(ServiceMember)自動加入。用於客服之間的轉接溝通、疑難討論。


3.8 business — 物件聊天室

屬性
策略實現BusinessRoomImpl
成員範圍多人
用途附屬於業務物件(訂單/案件/表單等)的聊天室
isMulti
isAccountRoom

設計意圖: 以業務物件(如訂單、案件)為中心建立聊天室。RoomModel 中的 businessIdbusinessNamebusinessStatus 欄位用於關聯業務物件及其生命週期狀態。

關鍵特性:


3.9 aileSystem — Aile 系統聊天室

屬性
策略實現AileSystemRoomImpl
成員範圍系統 + 員工
用途Aile 平台級系統通知
isMulti
isAccountRoom

設計意圖: 每個員工與 Aile 平台之間的 1:1 系統通知頻道。用於接收平台級公告、安全提醒、帳號通知等。TenantEmployeeModel.systemRoomId 指向這個聊天室。


3.10 aiwowSystem — Aiwow 系統聊天室

屬性
策略實現AiwowSystemRoomImpl
成員範圍系統 + 員工
用途Aiwow 子系統通知
isMulti
isAccountRoom

設計意圖:aileSystem 類似,但歸屬於 Aiwow 子系統。用於區分不同來源的系統通知。


3.11 system — 通用系統聊天室

屬性
策略實現SystemRoomImpl
成員範圍多人
用途系統級群發通知
isMulti❌(不在 isMulti 判斷中)
isAccountRoom

設計意圖: 更通用的系統級聊天室,可由系統向多位員工推送消息。消息發送時會排除發送者本人。


3.12 lineGroup — LINE 群組聊天室

屬性
策略實現LineGroupRoomImpl
成員範圍服務號 + LINE 群組成員
用途LINE 群組在 Aile 中的映射
isMulti❌(獨立判斷邏輯)
isAccountRoom

設計意圖: 這是為 LINE 渠道群組場景設計的專用聊天室類型。不創建 ServiceSession,不走機器人流程。詳見 line-group-implementation-spec.md


4. 類型分類總覽

4.1 依成員規模

分類類型判斷方法
多人group, discuss, business, serviceMemberisMulti(type)
非多人person, accountPerson, friend, services, aileSystem, aiwowSystem, system, lineGroup

4.2 依帳號層級

分類類型判斷方法
帳號級accountPerson, aileSystem, aiwowSystemisAccountRoom(type)
租戶級其餘 9 種類型

4.3 依通用性

分類類型判斷方法
通用聊天室discuss, friend, group, serviceMemberisCommon(type)
特殊聊天室其餘 8 種類型

4.4 依服務號關聯

關聯類型類型
強關聯服務號services, serviceMember, lineGroup, business
可關聯服務號group, discuss
無關聯person, accountPerson, friend, aileSystem, aiwowSystem, system

5. 聊天室建立流程

5.1 統一入口


    
    
    
  前端 / API 呼叫
  │
  └── RoomController.create(dto)
        │
        ├── 依 dto.type 選擇對應 RoomStrategy
        │
        └── RoomStrategy.createAdpter(adpterDto)
              │
              ├── valid()       → 參數校驗
              ├── create()      → 建立 RoomModel + 寫入 MongoDB
              ├── joinMembers() → 加入初始成員
              └── 返回 RoomModel

5.2 消息發送流程


    
    
    
  MessageController.send(dto)
  │
  └── MessageServiceImpl.sendMessage(dto)
        │
        ├── 查找 RoomModel
        ├── 建立 MessageModel
        ├── roomFactory.get(roomModel.getType()).sendMessage(room, message)
        │     │
        │     ├── checkMessage()      → 校驗 + 補齊發送者資訊
        │     ├── memberFilter()      → 過濾接收成員
        │     ├── send()              → 實際推送(Socket.IO)
        │     ├── dispatchSavedMessage() → 離線消息處理
        │     └── sendBatchToGateway()   → 外部渠道發送(services/lineGroup)
        │
        └── 寫入 Elasticsearch (index: aile.message)

6. 策略實現繼承關係


    
    
    
  RoomStrategy (interface)
  │
  └── CommonRoomImpl (abstract)         ← 通用邏輯基底
        │
        ├── PersonRoomImpl              @Component("person")
        ├── AccountPersonRoomImpl       @Component("accountPerson")  
        ├── FriendRoomImpl              @Component("friend")
        ├── GroupRoomImpl               @Component("group")
        ├── DiscussRoomImpl             @Component("discuss")
        ├── ServiceRoomImpl             @Component("services")
        ├── ServiceMemberRoomImpl       @Component("serviceMember")
        ├── BusinessRoomImpl            @Component("business")
        ├── AileSystemRoomImpl          @Component("aileSystem")
        ├── AiwowSystemRoomImpl         @Component("aiwowSystem")
        ├── SystemRoomImpl              @Component("system")
        └── LineGroupRoomImpl           @Component("lineGroup")

每個子類可覆寫的方法:

方法說明
valid()建立聊天室前的參數校驗
checkMessage()發送前檢查 + 補齊發送者名稱
memberFilter()過濾接收成員列表
send()實際推送消息(Socket.IO)
dispatchSavedMessage()離線消息處理

7. 快速對照表

類型成員規模隸屬層級用途場景ServiceSession助手觸發外部渠道
person1 人租戶個人筆記、系統通知
accountPerson1 人帳號跨租戶系統通知
friend2 人租戶員工私聊
group多人租戶員工群聊
discuss多人租戶主題討論
services客戶+服務號租戶客服私聊
serviceMember多人租戶客服內部群
business多人租戶業務物件討論
aileSystem系統+員工帳號平台通知
aiwowSystem系統+員工帳號子系統通知
system多人租戶系統群發
lineGroup服務號+群租戶LINE 群組

8. 成員分組(僅 services 類型使用)

services 聊天室內部使用 MemberGroupType 對成員進行分組管理:


    
    
    
  public enum MemberGroupType {
    ServiceAgent,        // 當前服務人員(接待客服)
    ServiceOwner,        // 服務號 Owner(最高權限)
    ServiceMember,       // 服務號成員(管理層)
    ProvisionalMember,   // 臨時內部成員(轉接/協助)
    ProvisionalCustomer  // 外部客戶
}

分組用途:


9. 未讀計數策略

不同聊天室類型使用獨立的 Redis Key 前綴進行未讀計數:

類型Redis Key 前綴
通用(friend/group/discuss 等)room:unread:common:*
服務號(services/serviceMember)room:unread:servicenumber:*
LineGrouproom:unread:linegroup:*
Businessroom:unread:business:*
租戶總計room:unread:tenant:total:*

10. 關鍵檔案索引

層級檔案說明
類型常量aile-api/aile-room-api/.../constant/RoomType.java12 種類型定義 + 判斷方法
核心模型aile-api/aile-room-api/.../model/RoomModel.java聊天室持久化模型
狀態枚舉aile-api/aile-room-api/.../enums/RoomStatus.java7 種狀態
物件狀態aile-api/aile-room-api/.../enums/BusinessStatus.java4 種業務狀態
成員分組aile-api/aile-room-api/.../enums/MemberGroupType.java5 種成員分組
工廠aile-service/aile-service-room/.../factory/RoomFactory.java策略工廠
策略接口aile-service/aile-service-room/.../factory/strategy/RoomStrategy.java策略接口
通用基底aile-service/aile-service-room/.../factory/strategy/impl/CommonRoomImpl.java抽象基底(所有策略的父類)
客服策略aile-service/aile-service-room/.../factory/strategy/impl/ServiceRoomImpl.javaservices 最核心策略
群組策略aile-service/aile-service-room/.../factory/strategy/impl/LineGroupRoomImpl.javalineGroup
物件策略aile-service/aile-service-room/.../factory/strategy/impl/BusinessRoomImpl.javabusiness
Redis Keyaile-api/aile-room-api/.../constant/RoomRedisKey.java未讀計數 Key 定義