Class WorkgroupThreadRoutingStrategy
java.lang.Object
com.bytedesk.service.routing_strategy.AbstractThreadRoutingStrategy
com.bytedesk.service.routing_strategy.WorkgroupThreadRoutingStrategy
@Component("workgroupThreadStrategy")
public class WorkgroupThreadRoutingStrategy
extends AbstractThreadRoutingStrategy
工作组线程路由策略
功能特点: - 支持机器人优先接待,可转人工 - 智能路由决策:根据工作组配置、服务时间、客服在线状态等因素决定路由方向 - 支持排队管理和离线留言 - 支持强制转人工和机器人转人工
路由决策流程: 1. 检查现有会话状态 2. 根据配置决定机器人或人工接待 3. 处理排队和离线场景 4. 支持会话状态转换
- Since:
- 1.0.0
- Author:
- Jack Ning 270580156@qq.com
-
Field Summary
FieldsModifier and TypeFieldDescriptionprivate final BytedeskEventPublisherprivate final MessageRestServiceprivate final IMessageSendServiceprivate final PresenceFacadeServiceprivate final QueueMemberRestServiceprivate final QueueServiceprivate final ThreadRestServiceprivate final VisitorThreadServiceprivate final WorkgroupRestServiceprivate final WorkgroupRoutingServiceFields inherited from class com.bytedesk.service.routing_strategy.AbstractThreadRoutingStrategy
ESTIMATED_WAIT_TIME_PER_PERSON, MESSAGE_CACHE_MINUTES -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptioncreateThread(VisitorRequest visitorRequest) 创建线程的核心方法 由具体实现类负责处理不同类型的线程创建逻辑createWorkgroupThread(VisitorRequest visitorRequest) 创建工作组会话private AgentEntityfindAvailableAgentWithCapacity(WorkgroupEntity workgroup, ThreadEntity thread, List<AgentEntity> availableAgents) 查找有空闲接待名额的客服private StringgenerateWorkgroupQueueMessage(VisitorRequest visitorRequest, WorkgroupEntity workgroup, int queuingCount, int avgWaitTimePerPerson) 生成工作组排队消息(使用模板)private StringgetAgentWelcomeMessage(VisitorRequest visitorRequest, AgentEntity agentEntity) getOfflineMessage(VisitorRequest visitorRequest, ThreadEntity threadFromRequest, AgentEntity agentEntity, WorkgroupEntity workgroup, QueueMemberEntity queueMemberEntity) 获取离线消息private ThreadEntitygetOrCreateWorkgroupThread(VisitorRequest visitorRequest, WorkgroupEntity workgroup, String topic) 获取或创建工作组会话private MessageProtobufgetRobotContinueMessage(RobotEntity robotEntity, ThreadEntity thread) 获取机器人继续对话消息private StringgetRobotWelcomeMessage(VisitorRequest visitorRequest, RobotEntity robotEntity) 获取机器人欢迎消息protected ThreadRestService获取线程服务实例 由具体实现类提供private MessageProtobufgetWorkgroupContinueMessage(VisitorRequest visitorRequest, ThreadEntity thread) 获取工作组继续对话消息private WorkgroupEntitygetWorkgroupEntity(String workgroupUid) 获取工作组实体private StringgetWorkgroupOfflineMessage(VisitorRequest visitorRequest, WorkgroupEntity workgroup) 获取工作组离线消息private MessageProtobufgetWorkgroupQueueMessage(VisitorRequest visitorRequest, ThreadEntity thread) 获取工作组排队消息private QueueSettingsEntitygetWorkgroupQueueSettings(VisitorRequest visitorRequest, WorkgroupEntity workgroup) 获取工作组排队配置private MessageProtobufhandleAllAgentsFullQueuing(VisitorRequest visitorRequest, ThreadEntity thread, WorkgroupEntity workgroup) 处理所有客服满员时的排队逻辑 入队时不设置 agent,等待有客服空闲时再分配private MessageProtobufhandleAvailableWorkgroup(VisitorRequest visitorRequest, ThreadEntity threadFromRequest, AgentEntity agentEntity, QueueMemberEntity queueMemberEntity) 处理可用工作组客服private MessageProtobufhandleExistingChatThread(VisitorRequest visitorRequest, ThreadEntity thread, WorkgroupEntity workgroup) 处理现有聊天会话private MessageProtobufhandleExistingOfflineThread(VisitorRequest visitorRequest, ThreadEntity thread, WorkgroupEntity workgroup) 处理现有离线会话private MessageProtobufhandleExistingRobotThread(VisitorRequest visitorRequest, ThreadEntity thread, WorkgroupEntity workgroup) 处理现有机器人会话private MessageProtobufhandleExistingWorkgroupThread(VisitorRequest visitorRequest, ThreadEntity thread, WorkgroupEntity workgroup) 处理现有工作组会话private voidhandleForceAgentTransfer(VisitorRequest visitorRequest, ThreadEntity thread, QueueMemberEntity queueMemberEntity) 处理强制转人工private MessageProtobufhandleQueuedWorkgroupWithoutAgent(VisitorRequest visitorRequest, ThreadEntity thread, WorkgroupEntity workgroup, QueueMemberEntity queueMemberEntity) 处理排队(无指定客服)private booleanhasCapacity(AgentEntity agent) 判断客服是否有空闲接待名额private booleanisDraftEnabled(VisitorRequest visitorRequest) 获取客服欢迎消息private voidnotifyAvailableAgentsOfQueue(WorkgroupEntity workgroup, ThreadEntity queuedThread, QueueMemberEntity queueMemberEntity, int queuingCount, int waitSeconds) 向工作组内在线可用客服广播排队通知private voidpublishWorkgroupThreadEvents(ThreadEntity savedThread) 发布工作组线程相关事件private booleanresolveIsInServiceTime(WorkgroupEntity workgroup) private intresolveMaxWaiting(QueueSettingsEntity settings) private MessageProtobufrouteNewWorkgroupThread(VisitorRequest visitorRequest, ThreadEntity thread, WorkgroupEntity workgroup) 路由新工作组会话private MessageProtobufrouteToAgent(VisitorRequest visitorRequest, ThreadEntity thread, WorkgroupEntity workgroup) 路由到人工客服private MessageProtobufrouteToAgentDuringServiceTime(VisitorRequest visitorRequest, ThreadEntity thread, WorkgroupEntity workgroup) 在服务时间内分配客服并根据在线/负载状态进行路由private MessageProtobufrouteToOfflineMessage(VisitorRequest visitorRequest, ThreadEntity thread, WorkgroupEntity workgroup) 不满足服务时间或无在线客服时,统一进入离线留言流程routeToRobot(VisitorRequest visitorRequest, ThreadEntity threadFromRequest, RobotEntity robotEntity, WorkgroupEntity workgroup) 路由到机器人private MessageProtobufrouteToRobot(VisitorRequest visitorRequest, ThreadEntity thread, WorkgroupEntity workgroup) 路由到机器人private voidsetThreadOwner(ThreadEntity thread, AgentEntity agentEntity) 设置线程所有者private booleanshouldForceLeaveMessage(QueueEntity queue, QueueSettingsEntity settings) private booleanshouldRouteToRobot(VisitorRequest visitorRequest, WorkgroupEntity workgroup) 判断是否应该路由到机器人private voidupdateQueueMemberForAgentAccept(QueueMemberEntity queueMemberEntity) 更新队列成员状态为客服自动接受private voidupdateQueueMemberForRobotAccept(QueueMemberEntity queueMemberEntity) 更新队列成员状态为机器人自动接受Methods inherited from class com.bytedesk.service.routing_strategy.AbstractThreadRoutingStrategy
executeWithExceptionHandling, generateQueueMessage, getThreadByUid, getValidOfflineMessage, getValidWelcomeMessage, handleStrategyException, isActiveThread, isClosedThread, isMessageInCacheTime, isNewThread, logThreadStatusChange, saveThread, validateThread, validateUid
-
Field Details
-
workgroupRestService
-
threadRestService
-
visitorThreadService
-
messageSendService
-
queueService
-
queueMemberRestService
-
messageRestService
-
workgroupRoutingService
-
bytedeskEventPublisher
-
presenceFacadeService
-
-
Constructor Details
-
WorkgroupThreadRoutingStrategy
public WorkgroupThreadRoutingStrategy()
-
-
Method Details
-
getThreadRestService
Description copied from class:AbstractThreadRoutingStrategy获取线程服务实例 由具体实现类提供- Specified by:
getThreadRestServicein classAbstractThreadRoutingStrategy- Returns:
- ThreadRestService实例
-
createThread
Description copied from class:AbstractThreadRoutingStrategy创建线程的核心方法 由具体实现类负责处理不同类型的线程创建逻辑- Specified by:
createThreadin classAbstractThreadRoutingStrategy- Parameters:
visitorRequest- 访客请求信息- Returns:
- 消息协议对象
-
createWorkgroupThread
创建工作组会话- Parameters:
visitorRequest- 访客请求- Returns:
- 消息协议对象
-
getWorkgroupEntity
获取工作组实体 -
getOrCreateWorkgroupThread
private ThreadEntity getOrCreateWorkgroupThread(VisitorRequest visitorRequest, WorkgroupEntity workgroup, String topic) 获取或创建工作组会话 -
handleExistingWorkgroupThread
private MessageProtobuf handleExistingWorkgroupThread(VisitorRequest visitorRequest, ThreadEntity thread, WorkgroupEntity workgroup) 处理现有工作组会话- Returns:
- 如果是现有活跃会话则返回相应消息,否则返回null继续新会话流程
-
handleExistingRobotThread
private MessageProtobuf handleExistingRobotThread(VisitorRequest visitorRequest, ThreadEntity thread, WorkgroupEntity workgroup) 处理现有机器人会话 -
handleExistingChatThread
private MessageProtobuf handleExistingChatThread(VisitorRequest visitorRequest, ThreadEntity thread, WorkgroupEntity workgroup) 处理现有聊天会话 -
handleExistingOfflineThread
private MessageProtobuf handleExistingOfflineThread(VisitorRequest visitorRequest, ThreadEntity thread, WorkgroupEntity workgroup) 处理现有离线会话 -
routeNewWorkgroupThread
private MessageProtobuf routeNewWorkgroupThread(VisitorRequest visitorRequest, ThreadEntity thread, WorkgroupEntity workgroup) 路由新工作组会话 -
shouldRouteToRobot
判断是否应该路由到机器人 -
routeToRobot
private MessageProtobuf routeToRobot(VisitorRequest visitorRequest, ThreadEntity thread, WorkgroupEntity workgroup) 路由到机器人 -
routeToAgent
private MessageProtobuf routeToAgent(VisitorRequest visitorRequest, ThreadEntity thread, WorkgroupEntity workgroup) 路由到人工客服 -
routeToAgentDuringServiceTime
private MessageProtobuf routeToAgentDuringServiceTime(VisitorRequest visitorRequest, ThreadEntity thread, WorkgroupEntity workgroup) 在服务时间内分配客服并根据在线/负载状态进行路由 -
findAvailableAgentWithCapacity
private AgentEntity findAvailableAgentWithCapacity(WorkgroupEntity workgroup, ThreadEntity thread, List<AgentEntity> availableAgents) 查找有空闲接待名额的客服- Parameters:
workgroup- 工作组thread- 会话线程availableAgents- 在线且可用的客服列表- Returns:
- 有空闲名额的客服,如果都满员则返回 null
-
hasCapacity
判断客服是否有空闲接待名额 -
handleAllAgentsFullQueuing
private MessageProtobuf handleAllAgentsFullQueuing(VisitorRequest visitorRequest, ThreadEntity thread, WorkgroupEntity workgroup) 处理所有客服满员时的排队逻辑 入队时不设置 agent,等待有客服空闲时再分配 -
handleQueuedWorkgroupWithoutAgent
private MessageProtobuf handleQueuedWorkgroupWithoutAgent(VisitorRequest visitorRequest, ThreadEntity thread, WorkgroupEntity workgroup, QueueMemberEntity queueMemberEntity) 处理排队(无指定客服) -
notifyAvailableAgentsOfQueue
private void notifyAvailableAgentsOfQueue(WorkgroupEntity workgroup, ThreadEntity queuedThread, QueueMemberEntity queueMemberEntity, int queuingCount, int waitSeconds) 向工作组内在线可用客服广播排队通知 -
routeToOfflineMessage
private MessageProtobuf routeToOfflineMessage(VisitorRequest visitorRequest, ThreadEntity thread, WorkgroupEntity workgroup) 不满足服务时间或无在线客服时,统一进入离线留言流程 -
handleForceAgentTransfer
private void handleForceAgentTransfer(VisitorRequest visitorRequest, ThreadEntity thread, QueueMemberEntity queueMemberEntity) 处理强制转人工 -
handleAvailableWorkgroup
private MessageProtobuf handleAvailableWorkgroup(VisitorRequest visitorRequest, ThreadEntity threadFromRequest, AgentEntity agentEntity, QueueMemberEntity queueMemberEntity) 处理可用工作组客服 -
getOfflineMessage
public MessageProtobuf getOfflineMessage(VisitorRequest visitorRequest, ThreadEntity threadFromRequest, AgentEntity agentEntity, WorkgroupEntity workgroup, QueueMemberEntity queueMemberEntity) 获取离线消息 -
routeToRobot
public MessageProtobuf routeToRobot(VisitorRequest visitorRequest, ThreadEntity threadFromRequest, RobotEntity robotEntity, WorkgroupEntity workgroup) 路由到机器人 -
getWorkgroupContinueMessage
private MessageProtobuf getWorkgroupContinueMessage(VisitorRequest visitorRequest, ThreadEntity thread) 获取工作组继续对话消息 -
getWorkgroupQueueMessage
private MessageProtobuf getWorkgroupQueueMessage(VisitorRequest visitorRequest, ThreadEntity thread) 获取工作组排队消息 -
getRobotContinueMessage
获取机器人继续对话消息 -
isDraftEnabled
获取客服欢迎消息 -
getAgentWelcomeMessage
-
getRobotWelcomeMessage
获取机器人欢迎消息 -
getWorkgroupOfflineMessage
获取工作组离线消息 -
getWorkgroupQueueSettings
private QueueSettingsEntity getWorkgroupQueueSettings(VisitorRequest visitorRequest, WorkgroupEntity workgroup) 获取工作组排队配置 -
shouldForceLeaveMessage
-
resolveMaxWaiting
-
generateWorkgroupQueueMessage
private String generateWorkgroupQueueMessage(VisitorRequest visitorRequest, WorkgroupEntity workgroup, int queuingCount, int avgWaitTimePerPerson) 生成工作组排队消息(使用模板)- Parameters:
workgroup- 工作组实体queuingCount- 当前排队人数avgWaitTimePerPerson- 每人平均等待时长(秒)- Returns:
- 替换模板变量后的排队提示语
-
setThreadOwner
设置线程所有者 -
updateQueueMemberForAgentAccept
更新队列成员状态为客服自动接受 -
updateQueueMemberForRobotAccept
更新队列成员状态为机器人自动接受 -
publishWorkgroupThreadEvents
发布工作组线程相关事件 -
resolveIsInServiceTime
-