mirror of
https://gitee.com/270580156/weiyu.git
synced 2025-12-30 10:52:26 +00:00
update
This commit is contained in:
@@ -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())
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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));
|
||||
|
||||
Reference in New Issue
Block a user