From 4f509eb4d04405ed9b19890bb5c7e7775963eb89 Mon Sep 17 00:00:00 2001 From: Hai Liang Wang Date: Tue, 10 Aug 2021 12:57:31 +0800 Subject: [PATCH] https://github.com/chatopera/cskefu/issues/440 enhance agent filter --- .../chatopera/cc/acd/ACDPolicyService.java | 85 +++++++++++++------ .../repository/UserRepository.java | 2 + .../chatopera/cc/proxy/OnlineUserProxy.java | 4 +- 3 files changed, 62 insertions(+), 29 deletions(-) diff --git a/contact-center/app/src/main/java/com/chatopera/cc/acd/ACDPolicyService.java b/contact-center/app/src/main/java/com/chatopera/cc/acd/ACDPolicyService.java index 7bdde37..a154b0a 100644 --- a/contact-center/app/src/main/java/com/chatopera/cc/acd/ACDPolicyService.java +++ b/contact-center/app/src/main/java/com/chatopera/cc/acd/ACDPolicyService.java @@ -20,14 +20,8 @@ import com.chatopera.cc.basic.Constants; import com.chatopera.cc.basic.MainContext; import com.chatopera.cc.basic.MainUtils; import com.chatopera.cc.cache.Cache; -import com.chatopera.cc.model.AgentStatus; -import com.chatopera.cc.model.AgentUser; -import com.chatopera.cc.model.SNSAccount; -import com.chatopera.cc.model.SessionConfig; -import com.chatopera.cc.persistence.repository.AgentUserRepository; -import com.chatopera.cc.persistence.repository.OnlineUserRepository; -import com.chatopera.cc.persistence.repository.SNSAccountRepository; -import com.chatopera.cc.persistence.repository.SessionConfigRepository; +import com.chatopera.cc.model.*; +import com.chatopera.cc.persistence.repository.*; import com.chatopera.cc.util.HashMapUtils; import com.chatopera.cc.util.WebIMReport; import org.apache.commons.lang.StringUtils; @@ -36,10 +30,7 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.List; -import java.util.Map; +import java.util.*; /** * 坐席自动分配策略集 @@ -51,6 +42,9 @@ public class ACDPolicyService { @Autowired private Cache cache; + @Autowired + private UserRepository userRes; + @Autowired private SessionConfigRepository sessionConfigRes; @@ -170,18 +164,22 @@ public class ACDPolicyService { } if (agentUser != null && StringUtils.isNotBlank(agentUser.getAgentno())) { - // 指定坐席 - for (final Map.Entry entry : map.entrySet()) { - // 被指定的坐席,不检查是否忙,是否达到最大接待数量 - if (StringUtils.equals( - entry.getValue().getAgentno(), agentUser.getAgentno())) { - agentStatuses.add(entry.getValue()); - logger.info( - "[filterOutAvailableAgentStatus] find ready agent {}, name {}, status {}, service {}/{}", - entry.getValue().getAgentno(), entry.getValue().getUsername(), entry.getValue().getStatus(), - entry.getValue().getUsers(), - entry.getValue().getMaxusers()); - break; + User user = userRes.findById(agentUser.getUserid()); + if (user != null && !user.isSuperadmin()) { + // 用户不为空,并且不是超级管理员 + // 指定坐席 + for (final Map.Entry entry : map.entrySet()) { + // 被指定的坐席,不检查是否忙,是否达到最大接待数量 + if (StringUtils.equals( + entry.getValue().getAgentno(), agentUser.getAgentno())) { + agentStatuses.add(entry.getValue()); + logger.info( + "[filterOutAvailableAgentStatus] find ready agent {}, name {}, status {}, service {}/{}", + entry.getValue().getAgentno(), entry.getValue().getUsername(), entry.getValue().getStatus(), + entry.getValue().getUsers(), + entry.getValue().getMaxusers()); + break; + } } } } @@ -190,7 +188,7 @@ public class ACDPolicyService { if (agentStatuses.size() == 1) { logger.info("[filterOutAvailableAgentStatus] agent status list size: {}", agentStatuses.size()); // 得到指定的坐席 - return agentStatuses; + return filterOutAgentStatusBySkipSuperAdmin(agentStatuses); } // Note 如果指定了坐席,但是该坐席却不是就绪的,那么就根据技能组或其它条件查找 @@ -226,7 +224,7 @@ public class ACDPolicyService { // 如果绑定了技能组,立即返回该技能组的人 // 这时候,如果该技能组没有人,也不按照其它条件查找 logger.info("[filterOutAvailableAgentStatus] agent status list size: {}", agentStatuses.size()); - return agentStatuses; + return filterOutAgentStatusBySkipSuperAdmin(agentStatuses); } else { /** * 在指定的坐席和技能组中未查到坐席 @@ -259,7 +257,40 @@ public class ACDPolicyService { } logger.info("[filterOutAvailableAgentStatus] agent status list size: {}", agentStatuses.size()); - return agentStatuses; + return filterOutAgentStatusBySkipSuperAdmin(agentStatuses); + } + + /** + * 过滤超级管理员 + * + * @param agentStatuses + * @return + */ + private List filterOutAgentStatusBySkipSuperAdmin(final List agentStatuses) { + List result = new ArrayList<>(); + List uids = new ArrayList<>(); + HashMap userMap = new HashMap<>(); + + for (final AgentStatus as : agentStatuses) { + if (StringUtils.isNotBlank(as.getUserid())) + uids.add(as.getUserid()); + } + + List users = userRes.findByIdIn(uids); + + for (final User u : users) { + userMap.put(u.getId(), u); + } + + for (final AgentStatus as : agentStatuses) { + if (userMap.containsKey(as.getUserid())) { + if (!userMap.get(as.getUserid()).isSuperadmin()) + result.add(as); + } + } + + logger.info("[filterOutAgentStatusBySkipSuperAdmin] agent status list size: {}", agentStatuses.size()); + return result; } diff --git a/contact-center/app/src/main/java/com/chatopera/cc/persistence/repository/UserRepository.java b/contact-center/app/src/main/java/com/chatopera/cc/persistence/repository/UserRepository.java index 92a1af5..0b0bc53 100644 --- a/contact-center/app/src/main/java/com/chatopera/cc/persistence/repository/UserRepository.java +++ b/contact-center/app/src/main/java/com/chatopera/cc/persistence/repository/UserRepository.java @@ -96,4 +96,6 @@ public interface UserRepository extends JpaRepository { List findByOrgiAndAgentAndDatastatusAndIdIsNot(final String orgi, boolean agent, boolean datastatus, final String id); Page findByIdIn(Iterable ids, Pageable pageRequest); + + List findByIdIn(List ids); } diff --git a/contact-center/app/src/main/java/com/chatopera/cc/proxy/OnlineUserProxy.java b/contact-center/app/src/main/java/com/chatopera/cc/proxy/OnlineUserProxy.java index 6ef8087..a46cf20 100644 --- a/contact-center/app/src/main/java/com/chatopera/cc/proxy/OnlineUserProxy.java +++ b/contact-center/app/src/main/java/com/chatopera/cc/proxy/OnlineUserProxy.java @@ -225,8 +225,8 @@ public class OnlineUserProxy { if (!skillOrgansByOrgi.isEmpty()) { for (User user : agentList) { - // 跳过管理员角色用户,不显示在技能组列表 - if (user.isAdmin() || user.isSuperadmin()) continue; + // 跳过超级管理员角色用户,不显示在技能组列表 + if (user.isSuperadmin()) continue; // 只显示在线的客服,跳过离线的客服 if (getCache().findOneAgentStatusByAgentnoAndOrig(user.getId(), origOrig) == null) continue; -- GitLab