diff --git a/modules/service/src/main/java/com/bytedesk/service/agent/AgentEntity.java b/modules/service/src/main/java/com/bytedesk/service/agent/AgentEntity.java index 4610435c84..de5ec4d229 100644 --- a/modules/service/src/main/java/com/bytedesk/service/agent/AgentEntity.java +++ b/modules/service/src/main/java/com/bytedesk/service/agent/AgentEntity.java @@ -118,9 +118,6 @@ public class AgentEntity extends BaseEntity { return this.status.equals(AgentStatusEnum.AWAY.name()); } - // 已完全移除 legacy connected 语义:请使用 PresenceFacadeService 进行在线/可接待判断 - // 如仍存在调用方,请重构为 presenceFacadeService.isAgentOnline...(agent) - public UserProtobuf toUserProtobuf() { return UserProtobuf.builder() .uid(this.getUid()) diff --git a/modules/service/src/main/java/com/bytedesk/service/utils/ServiceConvertUtils.java b/modules/service/src/main/java/com/bytedesk/service/utils/ServiceConvertUtils.java index 82d1d21fd5..37732fe709 100644 --- a/modules/service/src/main/java/com/bytedesk/service/utils/ServiceConvertUtils.java +++ b/modules/service/src/main/java/com/bytedesk/service/utils/ServiceConvertUtils.java @@ -46,6 +46,7 @@ import com.bytedesk.service.visitor.VisitorRequest; import com.bytedesk.service.visitor.VisitorResponse; import com.bytedesk.service.workgroup.WorkgroupEntity; import com.bytedesk.service.workgroup.WorkgroupResponse; +import com.bytedesk.service.presence.PresenceFacadeService; @UtilityClass public class ServiceConvertUtils { @@ -167,7 +168,55 @@ public class ServiceConvertUtils { // public static WorkgroupResponse convertToWorkgroupResponse(WorkgroupEntity workgroup) { - return getModelMapper().map(workgroup, WorkgroupResponse.class); + WorkgroupResponse resp = getModelMapper().map(workgroup, WorkgroupResponse.class); + try { + PresenceFacadeService presenceFacadeService = ApplicationContextHolder.getBean(PresenceFacadeService.class); + if (workgroup != null && workgroup.getAgents() != null) { + // 使用 presence + convertToAgentResponse 构建响应坐席列表 + java.util.List agentResponses = new java.util.ArrayList<>(); + long connected = 0L; + long available = 0L; + long connectedAndAvailable = 0L; + long offline = 0L; + long busy = 0L; + long away = 0L; + for (AgentEntity agent : workgroup.getAgents()) { + if (agent == null) continue; + boolean isOnline = presenceFacadeService.isAgentOnline(agent); + boolean isAvailable = agent.isAvailable(); + boolean isOnlineAndAvailable = presenceFacadeService.isAgentOnlineAndAvailable(agent); + // + if (isOnline) connected++; else offline++; + if (isAvailable) available++; + if (isOnlineAndAvailable) connectedAndAvailable++; + if (agent.isBusy()) busy++; + if (agent.isAway()) away++; + agentResponses.add(convertToAgentResponse(agent)); + } + resp.setAgents(agentResponses); + // 留言坐席转换(保留 null 安全) + if (workgroup.getMessageLeaveAgent() != null) { + resp.setMessageLeaveAgent(convertToAgentResponse(workgroup.getMessageLeaveAgent())); + } + resp.setConnectedAgentCount(connected) + .setAvailableAgentCount(available) + .setConnectedAndAvailableAgentCount(connectedAndAvailable) + .setOfflineAgentCount(offline) + .setBusyAgentCount(busy) + .setAwayAgentCount(away); + } else { + resp.setConnectedAgentCount(0L) + .setAvailableAgentCount(0L) + .setOfflineAgentCount(0L) + .setBusyAgentCount(0L) + .setAwayAgentCount(0L) + .setAgents(new java.util.ArrayList<>()) + .setMessageLeaveAgent(null); + } + } catch (Exception ignore) { + // 如果 PresenceFacadeService 不可用,保持已有映射(可能在早期启动阶段) + } + return resp; } /** diff --git a/modules/service/src/main/java/com/bytedesk/service/workgroup/WorkgroupEntity.java b/modules/service/src/main/java/com/bytedesk/service/workgroup/WorkgroupEntity.java index ecd4ddd784..4c0b9cfe7b 100644 --- a/modules/service/src/main/java/com/bytedesk/service/workgroup/WorkgroupEntity.java +++ b/modules/service/src/main/java/com/bytedesk/service/workgroup/WorkgroupEntity.java @@ -125,11 +125,6 @@ public class WorkgroupEntity extends BaseEntity { @ManyToOne(fetch = FetchType.LAZY) private AgentEntity messageLeaveAgent; - // 监控管理员agents - // @Builder.Default - // @ManyToMany(fetch = FetchType.LAZY) - // private List monitorAgents = new ArrayList<>(); - /** * Additional configuration data stored as JSON */ @@ -179,6 +174,15 @@ public class WorkgroupEntity extends BaseEntity { return WorkgroupRoutingModeEnum.ROUND_ROBIN.name(); } + // agent connected count + // @JsonIgnore + // public long getConnectedAgentCount() { + // if (this.agents == null || this.agents.isEmpty()) { + // return 0; + // } + // return this.agents.stream().filter(agent -> agent.isConnected()).count(); + // } + // agent available count @JsonIgnore public long getAvailableAgentCount() { diff --git a/modules/service/src/main/java/com/bytedesk/service/workgroup/WorkgroupResponse.java b/modules/service/src/main/java/com/bytedesk/service/workgroup/WorkgroupResponse.java index 98204b6b59..ecf22aac01 100644 --- a/modules/service/src/main/java/com/bytedesk/service/workgroup/WorkgroupResponse.java +++ b/modules/service/src/main/java/com/bytedesk/service/workgroup/WorkgroupResponse.java @@ -16,7 +16,8 @@ package com.bytedesk.service.workgroup; import java.util.List; import com.bytedesk.core.base.BaseResponse; -import com.bytedesk.core.rbac.user.UserProtobuf; +import com.bytedesk.service.agent.AgentResponse; +import com.bytedesk.service.workgroup_settings.WorkgroupSettingsResponse; import lombok.AllArgsConstructor; import lombok.Data; @@ -41,19 +42,17 @@ public class WorkgroupResponse extends BaseResponse { private String description; - // routingMode moved to settings; read from settings.routingMode - private String status; /** * Workgroup settings (loaded from settings entity) */ - private com.bytedesk.service.workgroup_settings.WorkgroupSettingsResponse settings; + private WorkgroupSettingsResponse settings; // - private List agents; + private List agents; - private UserProtobuf messageLeaveAgent; + private AgentResponse messageLeaveAgent; // agent connected count private Long connectedAgentCount; @@ -61,6 +60,9 @@ public class WorkgroupResponse extends BaseResponse { // agent available count private Long availableAgentCount; + // agent connected && available count + private Long connectedAndAvailableAgentCount; + // agent offline count private Long offlineAgentCount; diff --git a/modules/service/src/main/java/com/bytedesk/service/workgroup/WorkgroupRestService.java b/modules/service/src/main/java/com/bytedesk/service/workgroup/WorkgroupRestService.java index e5153470f7..3c9c126d84 100644 --- a/modules/service/src/main/java/com/bytedesk/service/workgroup/WorkgroupRestService.java +++ b/modules/service/src/main/java/com/bytedesk/service/workgroup/WorkgroupRestService.java @@ -18,7 +18,6 @@ import java.util.Iterator; import java.util.List; import java.util.Optional; -import org.modelmapper.ModelMapper; import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.CachePut; import org.springframework.data.domain.Page; @@ -36,6 +35,7 @@ import com.bytedesk.core.uid.UidUtils; import com.bytedesk.service.agent.AgentEntity; import com.bytedesk.service.agent.AgentRestService; import com.bytedesk.service.workgroup_settings.WorkgroupSettingsRestService; +import com.bytedesk.service.utils.ServiceConvertUtils; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -50,7 +50,7 @@ public class WorkgroupRestService extends BaseRestService slot.isActive(date, now)); @@ -98,7 +98,7 @@ public class WorktimeSettingEntity extends BaseEntity { private Boolean isInRegularWorktime(LocalDate date) { if (regularWorktimes == null || regularWorktimes.isEmpty()) { - return false; + return true; } LocalTime now = LocalTime.now(); return regularWorktimes.stream().anyMatch(slot -> slot.isActive(date, now));