This commit is contained in:
jack ning
2025-11-24 16:40:54 +08:00
parent 4ddef78f0a
commit 6e355ef234
6 changed files with 72 additions and 21 deletions

View File

@@ -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())

View File

@@ -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<AgentResponse> 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;
}
/**

View File

@@ -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<AgentEntity> 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() {

View File

@@ -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<UserProtobuf> agents;
private List<AgentResponse> 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;

View File

@@ -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<WorkgroupEntity, Workg
private final AgentRestService agentRestService;
private final ModelMapper modelMapper;
// private final ModelMapper modelMapper;
private final UidUtils uidUtils;
@@ -58,7 +58,6 @@ public class WorkgroupRestService extends BaseRestService<WorkgroupEntity, Workg
private final WorkgroupSettingsRestService workgroupSettingsRestService;
@Transactional
public WorkgroupResponse create(WorkgroupRequest request) {
// 判断uid是否已经存储如果已经存在则不创建新的workgroup
@@ -308,7 +307,7 @@ public class WorkgroupRestService extends BaseRestService<WorkgroupEntity, Workg
@Override
public WorkgroupResponse convertToResponse(WorkgroupEntity entity) {
return modelMapper.map(entity, WorkgroupResponse.class);
return ServiceConvertUtils.convertToWorkgroupResponse(entity);
}
@Override

View File

@@ -90,7 +90,7 @@ public class WorktimeSettingEntity extends BaseEntity {
private Boolean isInSpecialWorktime(LocalDate date) {
if (specialWorktimes == null || specialWorktimes.isEmpty()) {
return false;
return true;
}
LocalTime now = LocalTime.now();
return specialWorktimes.stream().anyMatch(slot -> 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));