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 7bdde377f3e197432e33e4c2e93b799419033512..a154b0ab1cf60efd38a721dc9879d5480211d456 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 92a1af5838987ac7af5cf0a30498d825b4588214..0b0bc53a6ea48a1dd1a9da89b526c5a499606562 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 6ef80879c93f7a40d870fe9fc728031aa1914772..a46cf202e107b10e0a947b85d1cdb6646024b99e 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;