1
0
mirror of https://github.com/chatopera/cosin.git synced 2025-08-05 20:41:34 +08:00

Fix AgentUserRepository related class

This commit is contained in:
dengchao@xgtl 2020-04-16 14:33:30 +08:00
parent af069c4363
commit 1644826f5b
11 changed files with 994 additions and 1166 deletions

View File

@ -27,55 +27,59 @@ import com.chatopera.cc.socketio.client.NettyClients;
import com.chatopera.cc.util.SerializeUtil; import com.chatopera.cc.util.SerializeUtil;
import com.google.gson.JsonObject; import com.google.gson.JsonObject;
import com.google.gson.JsonParser; import com.google.gson.JsonParser;
import lombok.RequiredArgsConstructor;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.annotation.JmsListener; import org.springframework.jms.annotation.JmsListener;
import org.springframework.lang.NonNull;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.Optional;
/** /**
* 会话监控 * 会话监控
*/ */
@Component @Component
@RequiredArgsConstructor
public class AgentAuditSubscription { public class AgentAuditSubscription {
private final static Logger logger = LoggerFactory.getLogger(AgentAuditSubscription.class); private final static Logger logger = LoggerFactory.getLogger(AgentAuditSubscription.class);
@Autowired @NonNull
private Cache cache; private final Cache cache;
@Autowired @NonNull
private AgentAuditProxy agentAuditProxy; private final AgentAuditProxy agentAuditProxy;
@Autowired @NonNull
private AgentUserRepository agentUserRes; private final AgentUserRepository agentUserRes;
/** /**
* 接收坐席会话监控消息 * 接收坐席会话监控消息
*
* @param msg
*/ */
@JmsListener(destination = Constants.AUDIT_AGENT_MESSAGE, containerFactory = "jmsListenerContainerTopic") @JmsListener(destination = Constants.AUDIT_AGENT_MESSAGE, containerFactory = "jmsListenerContainerTopic")
public void onMessage(final String msg) { public void onMessage(final String msg) {
logger.info("[onMessage] payload {}", msg); logger.info("[onMessage] payload {}", msg);
try { try {
final JsonObject json = new JsonParser().parse(msg).getAsJsonObject(); final JsonObject json = JsonParser.parseString(msg).getAsJsonObject();
if (json.has("orgi") && json.has("data") && if (json.has("orgi") && json.has("data") &&
json.has("agentUserId") && json.has("agentUserId") &&
json.has("event") && json.has("agentno")) { json.has("event") && json.has("agentno")) {
// 查找关联的会话监控信息 // 查找关联的会话监控信息
String agentUserId = json.get("agentUserId").getAsString();
final AgentUserAudit agentUserAudit = cache.findOneAgentUserAuditByOrgiAndId( final AgentUserAudit agentUserAudit = cache.findOneAgentUserAuditByOrgiAndId(
json.get("orgi").getAsString(), json.get("orgi").getAsString(),
json.get("agentUserId").getAsString()).orElseGet(() -> { agentUserId).orElseGet(() -> {
final AgentUser agentUser = agentUserRes.findOne(json.get("agentUserId").getAsString()); Optional<AgentUser> optional = agentUserRes.findById(agentUserId);
if (agentUser != null) { if (optional.isPresent()) {
final AgentUser agentUser = optional.get();
return agentAuditProxy.updateAgentUserAudits(agentUser); return agentAuditProxy.updateAgentUserAudits(agentUser);
} else { } else {
logger.warn( logger.warn(
"[onMessage] can not find agent user by id {}", json.get("agentUserId").getAsString()); "[onMessage] can not find agent user by id {}", agentUserId);
} }
return null; return null;
}); });
@ -101,7 +105,7 @@ public class AgentAuditSubscription {
} else { } else {
logger.warn( logger.warn(
"[onMessage] can not resolve agent user audit object for agent user id {}", "[onMessage] can not resolve agent user audit object for agent user id {}",
json.get("agentUserId").getAsString()); agentUserId);
} }
} else { } else {
throw new CSKefuException("Invalid payload."); throw new CSKefuException("Invalid payload.");

View File

@ -23,34 +23,51 @@ import com.chatopera.cc.persistence.repository.AgentUserRepository;
import com.chatopera.cc.persistence.repository.OnlineUserRepository; import com.chatopera.cc.persistence.repository.OnlineUserRepository;
import com.chatopera.cc.util.SerializeUtil; import com.chatopera.cc.util.SerializeUtil;
import com.chatopera.cc.util.freeswitch.model.CallCenterAgent; import com.chatopera.cc.util.freeswitch.model.CallCenterAgent;
import lombok.RequiredArgsConstructor;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.lang.NonNull;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.io.Serializable; import java.io.Serializable;
import java.util.*; import java.util.*;
@Component @Component
@RequiredArgsConstructor
public class Cache { public class Cache {
final static private Logger logger = LoggerFactory.getLogger(Cache.class); final static private Logger logger = LoggerFactory.getLogger(Cache.class);
@Autowired @NonNull
private OnlineUserRepository onlineUserRes; private final OnlineUserRepository onlineUserRes;
@Autowired @NonNull
private AgentUserRepository agentUserRes; private final AgentUserRepository agentUserRes;
@Autowired @NonNull
private RedisCommand redisCommand; private final RedisCommand redisCommand;
/**
* Inline方法
*/
private static Map<String, AgentStatus> convertFromStringToAgentStatus(final Map<String, String> map) {
Map<String, AgentStatus> result = new HashMap<>();
for (Map.Entry<String, String> entry : map.entrySet()) {
AgentStatus obj = SerializeUtil.deserialize(entry.getValue());
result.put(entry.getKey(), obj);
}
return result;
}
private static OnlineUser convertFromStringToOnlineUser(final String serialized) {
return SerializeUtil.deserialize(serialized);
}
/** /**
* 获得就绪的坐席列表 * 获得就绪的坐席列表
* *
* @param orgi 租户 * @param orgi 租户
* @return
*/ */
public Map<String, AgentStatus> getAgentStatusReadyByOrig(final String orgi) { public Map<String, AgentStatus> getAgentStatusReadyByOrig(final String orgi) {
Map<String, String> agentStatuses = redisCommand.getHash(RedisKey.getAgentStatusReadyHashKey(orgi)); Map<String, String> agentStatuses = redisCommand.getHash(RedisKey.getAgentStatusReadyHashKey(orgi));
@ -59,23 +76,19 @@ public class Cache {
/** /**
* 通过访客ID和ORGI获得访客坐席关联关系 * 通过访客ID和ORGI获得访客坐席关联关系
*
* @param userId
* @param orgi
* @return
*/ */
public Optional<AgentUser> findOneAgentUserByUserIdAndOrgi(final String userId, final String orgi) { public Optional<AgentUser> findOneAgentUserByUserIdAndOrgi(final String userId, final String orgi) {
if (redisCommand.hasHashKV(RedisKey.getAgentUserInQueHashKey(orgi), userId)) { if (redisCommand.hasHashKV(RedisKey.getAgentUserInQueHashKey(orgi), userId)) {
// 排队等待中 // 排队等待中
return Optional.ofNullable((AgentUser) SerializeUtil.deserialize( return Optional.ofNullable(SerializeUtil.deserialize(
redisCommand.getHashKV(RedisKey.getAgentUserInQueHashKey(orgi), userId))); redisCommand.getHashKV(RedisKey.getAgentUserInQueHashKey(orgi), userId)));
} else if (redisCommand.hasHashKV(RedisKey.getAgentUserInServHashKey(orgi), userId)) { } else if (redisCommand.hasHashKV(RedisKey.getAgentUserInServHashKey(orgi), userId)) {
// 服务中 // 服务中
return Optional.ofNullable((AgentUser) SerializeUtil.deserialize( return Optional.ofNullable(SerializeUtil.deserialize(
redisCommand.getHashKV(RedisKey.getAgentUserInServHashKey(orgi), userId))); redisCommand.getHashKV(RedisKey.getAgentUserInServHashKey(orgi), userId)));
} else if (redisCommand.hasHashKV(RedisKey.getAgentUserEndHashKey(orgi), userId)) { } else if (redisCommand.hasHashKV(RedisKey.getAgentUserEndHashKey(orgi), userId)) {
// 已经结束 // 已经结束
return Optional.ofNullable((AgentUser) SerializeUtil.deserialize( return Optional.ofNullable(SerializeUtil.deserialize(
redisCommand.getHashKV(RedisKey.getAgentUserEndHashKey(orgi), userId))); redisCommand.getHashKV(RedisKey.getAgentUserEndHashKey(orgi), userId)));
} else { } else {
// 缓存中没有找到继续到数据库查找 // 缓存中没有找到继续到数据库查找
@ -83,19 +96,15 @@ public class Cache {
} }
} }
/** /**
* 返回排队中的客服列表 * 返回排队中的客服列表
*
* @param orgi
* @return
*/ */
public Map<String, AgentUser> getAgentUsersInQueByOrgi(final String orgi) { public Map<String, AgentUser> getAgentUsersInQueByOrgi(final String orgi) {
Map<String, String> agentUsers = redisCommand.getHash(RedisKey.getAgentUserInQueHashKey(orgi)); Map<String, String> agentUsers = redisCommand.getHash(RedisKey.getAgentUserInQueHashKey(orgi));
Map<String, AgentUser> map = new HashMap<>(); Map<String, AgentUser> map = new HashMap<>();
for (final Map.Entry<String, String> entry : agentUsers.entrySet()) { for (final Map.Entry<String, String> entry : agentUsers.entrySet()) {
final AgentUser obj = SerializeUtil.deserialize(entry.getValue()); final AgentUser obj = SerializeUtil.deserialize(entry.getValue());
map.put(obj.getId(), obj); map.put(Objects.requireNonNull(obj).getId(), obj);
} }
return map; return map;
} }
@ -103,20 +112,13 @@ public class Cache {
/** /**
* 将访客ID从服务中队列中删除 * 将访客ID从服务中队列中删除
* TODO 将访客对应的客服的服务列表变更 * TODO 将访客对应的客服的服务列表变更
*
* @param userid
* @param orgi
*/ */
public void deleteAgentUserInservByAgentUserIdAndOrgi(final String userid, final String orgi) { public void deleteAgentUserInservByAgentUserIdAndOrgi(final String userid, final String orgi) {
redisCommand.delHashKV(RedisKey.getAgentUserInServHashKey(orgi), userid); redisCommand.delHashKV(RedisKey.getAgentUserInServHashKey(orgi), userid);
} }
/** /**
* 将访客ID从排队队列中删除 * 将访客ID从排队队列中删除
*
* @param userid
* @param orgi
*/ */
public void deleteAgentUserInqueByAgentUserIdAndOrgi(final String userid, final String orgi) { public void deleteAgentUserInqueByAgentUserIdAndOrgi(final String userid, final String orgi) {
redisCommand.delHashKV(RedisKey.getAgentUserInQueHashKey(orgi), userid); redisCommand.delHashKV(RedisKey.getAgentUserInQueHashKey(orgi), userid);
@ -127,7 +129,6 @@ public class Cache {
* *
* @param agentno 坐席ID * @param agentno 坐席ID
* @param orgi 租户ID * @param orgi 租户ID
* @return
*/ */
public AgentStatus findOneAgentStatusByAgentnoAndOrig(final String agentno, final String orgi) { public AgentStatus findOneAgentStatusByAgentnoAndOrig(final String agentno, final String orgi) {
String status = getAgentStatusStatus(agentno, orgi); String status = getAgentStatusStatus(agentno, orgi);
@ -140,15 +141,12 @@ public class Cache {
String val = redisCommand.getHashKV(RedisKey.getAgentStatusHashKeyByStatusStr(orgi, status), agentno); String val = redisCommand.getHashKV(RedisKey.getAgentStatusHashKeyByStatusStr(orgi, status), agentno);
AgentStatus result = SerializeUtil.deserialize(val); AgentStatus result = SerializeUtil.deserialize(val);
logger.debug("[findOneAgentStatusByAgentnoAndOrig] result: username {}", result.getUsername()); logger.debug("[findOneAgentStatusByAgentnoAndOrig] result: username {}", Objects.requireNonNull(result).getUsername());
return result; return result;
} }
/** /**
* 更新坐席状态 * 更新坐席状态
*
* @param agentStatus
* @param orgi
*/ */
public void putAgentStatusByOrgi(AgentStatus agentStatus, String orgi) { public void putAgentStatusByOrgi(AgentStatus agentStatus, String orgi) {
String pre = getAgentStatusStatus(agentStatus.getAgentno(), orgi); // 坐席前状态 String pre = getAgentStatusStatus(agentStatus.getAgentno(), orgi); // 坐席前状态
@ -160,14 +158,12 @@ public class Cache {
RedisKey.getAgentStatusHashKeyByStatusStr(orgi, agentStatus.getStatus()), RedisKey.getAgentStatusHashKeyByStatusStr(orgi, agentStatus.getStatus()),
agentStatus.getAgentno(), SerializeUtil.serialize(agentStatus)); agentStatus.getAgentno(), SerializeUtil.serialize(agentStatus));
} }
return;
} else { } else {
// 之前存在与将要更新的状态一致 // 之前存在与将要更新的状态一致
if (StringUtils.equals(pre, agentStatus.getStatus())) { if (StringUtils.equals(pre, agentStatus.getStatus())) {
redisCommand.setHashKV( redisCommand.setHashKV(
RedisKey.getAgentStatusHashKeyByStatusStr(orgi, pre), agentStatus.getAgentno(), RedisKey.getAgentStatusHashKeyByStatusStr(orgi, pre), agentStatus.getAgentno(),
SerializeUtil.serialize(agentStatus)); SerializeUtil.serialize(agentStatus));
return;
} else { } else {
// 之前存在而且与新状态不一致 // 之前存在而且与新状态不一致
redisCommand.delHashKV(RedisKey.getAgentStatusHashKeyByStatusStr(orgi, pre), agentStatus.getAgentno()); redisCommand.delHashKV(RedisKey.getAgentStatusHashKeyByStatusStr(orgi, pre), agentStatus.getAgentno());
@ -182,9 +178,6 @@ public class Cache {
/** /**
* 获得一个租户的就绪坐席状态 * 获得一个租户的就绪坐席状态
*
* @param orgi
* @return
*/ */
public Map<String, AgentStatus> findAllReadyAgentStatusByOrgi(final String orgi) { public Map<String, AgentStatus> findAllReadyAgentStatusByOrgi(final String orgi) {
List<String> keys = new ArrayList<>(); List<String> keys = new ArrayList<>();
@ -196,9 +189,6 @@ public class Cache {
/** /**
* 获得一个租户的所有坐席状态 * 获得一个租户的所有坐席状态
*
* @param orgi
* @return
*/ */
public Map<String, AgentStatus> findAllAgentStatusByOrgi(final String orgi) { public Map<String, AgentStatus> findAllAgentStatusByOrgi(final String orgi) {
List<String> keys = new ArrayList<>(); List<String> keys = new ArrayList<>();
@ -210,25 +200,8 @@ public class Cache {
return convertFromStringToAgentStatus(map); return convertFromStringToAgentStatus(map);
} }
/**
* Inline方法
*/
private static Map<String, AgentStatus> convertFromStringToAgentStatus(final Map<String, String> map) {
Map<String, AgentStatus> result = new HashMap<String, AgentStatus>();
for (Map.Entry<String, String> entry : map.entrySet()) {
AgentStatus obj = SerializeUtil.deserialize(entry.getValue());
result.put(entry.getKey(), obj);
}
return result;
}
/** /**
* Delete Agent Status * Delete Agent Status
*
* @param agentno
* @param orgi
*/ */
public void deleteAgentStatusByAgentnoAndOrgi(final String agentno, final String orgi) { public void deleteAgentStatusByAgentnoAndOrgi(final String agentno, final String orgi) {
String status = getAgentStatusStatus(agentno, orgi); String status = getAgentStatusStatus(agentno, orgi);
@ -240,10 +213,6 @@ public class Cache {
/** /**
* 获得一个坐席的状态 agentStatus.status * 获得一个坐席的状态 agentStatus.status
* 只返回大类状态 * 只返回大类状态
*
* @param agentno
* @param orgi
* @return
*/ */
private String getAgentStatusStatus(final String agentno, final String orgi) { private String getAgentStatusStatus(final String agentno, final String orgi) {
// 首先判断这个坐席的状态是READY还是BUSY再去更新 // 首先判断这个坐席的状态是READY还是BUSY再去更新
@ -256,24 +225,18 @@ public class Cache {
} }
} }
/** /**
* 获得技能组的坐席状态 * 获得技能组的坐席状态
*
* @param skill
* @param orgi
* @return
*/ */
public List<AgentStatus> getAgentStatusBySkillAndOrgi(final String skill, final String orgi) { public List<AgentStatus> getAgentStatusBySkillAndOrgi(final String skill, final String orgi) {
Map<String, AgentStatus> map = findAllAgentStatusByOrgi(orgi); Map<String, AgentStatus> map = findAllAgentStatusByOrgi(orgi);
List<AgentStatus> agentList = new ArrayList<AgentStatus>(); List<AgentStatus> agentList = new ArrayList<>();
for (Map.Entry<String, AgentStatus> entry : map.entrySet()) { for (Map.Entry<String, AgentStatus> entry : map.entrySet()) {
if (StringUtils.isNotBlank(skill)) { if (StringUtils.isNotBlank(skill)) {
if (entry.getValue().getSkills() != null && if (entry.getValue().getSkills() != null &&
entry.getValue().getSkills().containsKey(skill)) { entry.getValue().getSkills().containsKey(skill)) {
agentList.add(entry.getValue()); agentList.add(entry.getValue());
continue;
} }
} else { } else {
agentList.add(entry.getValue()); agentList.add(entry.getValue());
@ -282,21 +245,18 @@ public class Cache {
return agentList; return agentList;
} }
//**************************
//* AgentUser相关
//**************************
/** /**
* 获得指定租户的就绪的坐席个数 * 获得指定租户的就绪的坐席个数
*
* @param orgi
* @return
*/ */
public int getAgentStatusReadySizeByOrgi(final String orgi) { public int getAgentStatusReadySizeByOrgi(final String orgi) {
return Math.toIntExact(redisCommand.getHashSize(RedisKey.getAgentStatusReadyHashKey(orgi))); return Math.toIntExact(redisCommand.getHashSize(RedisKey.getAgentStatusReadyHashKey(orgi)));
} }
/**************************
* AgentUser相关
**************************/
/** /**
* 更新坐席访客关联关系 * 更新坐席访客关联关系
* TODO 更新坐席的访客列表信息增加新的访客信息 * TODO 更新坐席的访客列表信息增加新的访客信息
@ -305,7 +265,6 @@ public class Cache {
* 但是之前那个关联坐席的信息需要删除要另行维护 * 但是之前那个关联坐席的信息需要删除要另行维护
* *
* @param agentUser 最新的agentUser的状态 * @param agentUser 最新的agentUser的状态
* @param orgi
*/ */
@AgentUserAspect.LinkAgentUser @AgentUserAspect.LinkAgentUser
public void putAgentUserByOrgi(AgentUser agentUser, String orgi) { public void putAgentUserByOrgi(AgentUser agentUser, String orgi) {
@ -335,13 +294,8 @@ public class Cache {
} }
} }
/** /**
* 获得一个客服服务中的访客列表 * 获得一个客服服务中的访客列表
*
* @param agentno
* @param orgi
* @return
*/ */
public List<AgentUser> findInservAgentUsersByAgentnoAndOrgi(final String agentno, final String orgi) { public List<AgentUser> findInservAgentUsersByAgentnoAndOrgi(final String agentno, final String orgi) {
logger.info("[findInservAgentUsersByAgentnoAndOrgi] agentno {}, orgi {}", agentno, orgi); logger.info("[findInservAgentUsersByAgentnoAndOrgi] agentno {}, orgi {}", agentno, orgi);
@ -358,10 +312,6 @@ public class Cache {
/** /**
* 获得一个坐席服务中的访客数量 * 获得一个坐席服务中的访客数量
*
* @param agentno
* @param orgi
* @return
*/ */
public int getInservAgentUsersSizeByAgentnoAndOrgi(final String agentno, final String orgi) { public int getInservAgentUsersSizeByAgentnoAndOrgi(final String agentno, final String orgi) {
return Math.toIntExact(redisCommand.getSetSize(RedisKey.getInServAgentUsersByAgentnoAndOrgi(agentno, orgi))); return Math.toIntExact(redisCommand.getSetSize(RedisKey.getInServAgentUsersByAgentnoAndOrgi(agentno, orgi)));
@ -369,9 +319,6 @@ public class Cache {
/** /**
* 获得服务中的访客的数量 * 获得服务中的访客的数量
*
* @param orgi
* @return
*/ */
public int getInservAgentUsersSizeByOrgi(final String orgi) { public int getInservAgentUsersSizeByOrgi(final String orgi) {
return redisCommand.getHashSize(RedisKey.getAgentUserInServHashKey(orgi)); return redisCommand.getHashSize(RedisKey.getAgentUserInServHashKey(orgi));
@ -379,9 +326,6 @@ public class Cache {
/** /**
* 获得等待中的访客的数量 * 获得等待中的访客的数量
*
* @param orgi
* @return
*/ */
public int getInqueAgentUsersSizeByOrgi(final String orgi) { public int getInqueAgentUsersSizeByOrgi(final String orgi) {
return redisCommand.getHashSize(RedisKey.getAgentUserInQueHashKey(orgi)); return redisCommand.getHashSize(RedisKey.getAgentUserInQueHashKey(orgi));
@ -389,9 +333,6 @@ public class Cache {
/** /**
* Delete agentUser * Delete agentUser
*
* @param agentUser
* @param orgi
*/ */
@AgentUserAspect.LinkAgentUser @AgentUserAspect.LinkAgentUser
public void deleteAgentUserByUserIdAndOrgi(final AgentUser agentUser, String orgi) { public void deleteAgentUserByUserIdAndOrgi(final AgentUser agentUser, String orgi) {
@ -402,9 +343,8 @@ public class Cache {
redisCommand.delHashKV(RedisKey.getAgentUserInServHashKey(orgi), agentUser.getUserid()); redisCommand.delHashKV(RedisKey.getAgentUserInServHashKey(orgi), agentUser.getUserid());
} else if (redisCommand.hasHashKV(RedisKey.getAgentUserEndHashKey(orgi), agentUser.getUserid())) { } else if (redisCommand.hasHashKV(RedisKey.getAgentUserEndHashKey(orgi), agentUser.getUserid())) {
redisCommand.delHashKV(RedisKey.getAgentUserEndHashKey(orgi), agentUser.getUserid()); redisCommand.delHashKV(RedisKey.getAgentUserEndHashKey(orgi), agentUser.getUserid());
} else {
// TODO 考虑是否有其他状态保存
} }
// TODO 考虑是否有其他状态保存
} }
/*************************** /***************************
@ -425,20 +365,17 @@ public class Cache {
} }
} }
public void deleteConsultInviteBySnsidAndOrgi(final String snsid, final String orgi) {
redisCommand.delHashKV(RedisKey.getConsultInvitesByOrgi(orgi), snsid);
}
/**************************** /****************************
* OnlineUser相关 * OnlineUser相关
****************************/ ****************************/
public void deleteConsultInviteBySnsidAndOrgi(final String snsid, final String orgi) {
redisCommand.delHashKV(RedisKey.getConsultInvitesByOrgi(orgi), snsid);
}
/** /**
* 更新 onlineUser * 更新 onlineUser
*
* @param onlineUser
* @param orgi
*/ */
public void putOnlineUserByOrgi(final OnlineUser onlineUser, final String orgi) { public void putOnlineUserByOrgi(final OnlineUser onlineUser, final String orgi) {
// 此处onlineUser的id onlineUser userId相同 // 此处onlineUser的id onlineUser userId相同
@ -448,10 +385,6 @@ public class Cache {
/** /**
* 获得 onlineUser * 获得 onlineUser
*
* @param id
* @param orgi
* @return
*/ */
public OnlineUser findOneOnlineUserByUserIdAndOrgi(final String id, final String orgi) { public OnlineUser findOneOnlineUserByUserIdAndOrgi(final String id, final String orgi) {
String serialized = redisCommand.getHashKV(RedisKey.getOnlineUserHashKey(orgi), id); String serialized = redisCommand.getHashKV(RedisKey.getOnlineUserHashKey(orgi), id);
@ -463,16 +396,8 @@ public class Cache {
} }
} }
private static OnlineUser convertFromStringToOnlineUser(final String serialized) {
OnlineUser obj = SerializeUtil.deserialize(serialized);
return obj;
}
/** /**
* 删除 onlineUser * 删除 onlineUser
*
* @param id
* @param orgi
*/ */
public void deleteOnlineUserByIdAndOrgi(final String id, final String orgi) { public void deleteOnlineUserByIdAndOrgi(final String id, final String orgi) {
redisCommand.delHashKV(RedisKey.getOnlineUserHashKey(orgi), id); redisCommand.delHashKV(RedisKey.getOnlineUserHashKey(orgi), id);
@ -480,8 +405,6 @@ public class Cache {
/** /**
* 根据租户ID获得在线访客的列表大小 * 根据租户ID获得在线访客的列表大小
*
* @param orgi
*/ */
public int getOnlineUserSizeByOrgi(final String orgi) { public int getOnlineUserSizeByOrgi(final String orgi) {
return redisCommand.getHashSize(RedisKey.getOnlineUserHashKey(orgi)); return redisCommand.getHashSize(RedisKey.getOnlineUserHashKey(orgi));
@ -490,10 +413,6 @@ public class Cache {
/** /**
* 将在线访客从一个坐席的服务列表中删除 * 将在线访客从一个坐席的服务列表中删除
*
* @param userid
* @param agentno
* @param orgi
*/ */
public void deleteOnlineUserIdFromAgentStatusByUseridAndAgentnoAndOrgi(final String userid, final String agentno, final String orgi) { public void deleteOnlineUserIdFromAgentStatusByUseridAndAgentnoAndOrgi(final String userid, final String agentno, final String orgi) {
redisCommand.removeSetVal(RedisKey.getInServAgentUsersByAgentnoAndOrgi(agentno, orgi), userid); redisCommand.removeSetVal(RedisKey.getInServAgentUsersByAgentnoAndOrgi(agentno, orgi), userid);
@ -509,16 +428,12 @@ public class Cache {
} }
/****************************** //******************************
* Callcenter Agent 相关 //* Callcenter Agent 相关
******************************/ //******************************
/** /**
* 更新CallCenterAgent * 更新CallCenterAgent
*
* @param id
* @param orgi
* @param agent
*/ */
public void putCallCenterAgentByIdAndOrgi(final String id, final String orgi, final CallCenterAgent agent) { public void putCallCenterAgentByIdAndOrgi(final String id, final String orgi, final CallCenterAgent agent) {
redisCommand.setHashKV(RedisKey.getCallCenterAgentHashKeyByOrgi(orgi), id, SerializeUtil.serialize(agent)); redisCommand.setHashKV(RedisKey.getCallCenterAgentHashKeyByOrgi(orgi), id, SerializeUtil.serialize(agent));
@ -526,10 +441,6 @@ public class Cache {
/** /**
* 根据ID和租户ID获得CallCenterAgent * 根据ID和租户ID获得CallCenterAgent
*
* @param id
* @param orgi
* @return
*/ */
public CallCenterAgent findOneCallCenterAgentByIdAndOrgi(final String id, final String orgi) { public CallCenterAgent findOneCallCenterAgentByIdAndOrgi(final String id, final String orgi) {
String serialized = redisCommand.getHashKV(RedisKey.getCallCenterAgentHashKeyByOrgi(orgi), id); String serialized = redisCommand.getHashKV(RedisKey.getCallCenterAgentHashKeyByOrgi(orgi), id);
@ -542,9 +453,6 @@ public class Cache {
/** /**
* 删除CallCenterAgent * 删除CallCenterAgent
*
* @param id
* @param orgi
*/ */
public void deleteCallCenterAgentByIdAndOrgi(final String id, final String orgi) { public void deleteCallCenterAgentByIdAndOrgi(final String id, final String orgi) {
redisCommand.delHashKV(RedisKey.getCallCenterAgentHashKeyByOrgi(orgi), id); redisCommand.delHashKV(RedisKey.getCallCenterAgentHashKeyByOrgi(orgi), id);
@ -553,9 +461,6 @@ public class Cache {
/** /**
* 根据租户ID获得所有的CallCenterAgent * 根据租户ID获得所有的CallCenterAgent
*
* @param orgi
* @return
*/ */
public Map<String, CallCenterAgent> findAllCallCenterAgentsByOrgi(final String orgi) { public Map<String, CallCenterAgent> findAllCallCenterAgentsByOrgi(final String orgi) {
Map<String, String> map = redisCommand.getHash(RedisKey.getCallCenterAgentHashKeyByOrgi(orgi)); Map<String, String> map = redisCommand.getHash(RedisKey.getCallCenterAgentHashKeyByOrgi(orgi));
@ -654,6 +559,7 @@ public class Cache {
public List<SysDic> getSysDicItemsByCodeAndOrgi(final String code, final String orgi) { public List<SysDic> getSysDicItemsByCodeAndOrgi(final String code, final String orgi) {
String serialized = redisCommand.getHashKV(RedisKey.getSysDicHashKeyByOrgi(orgi), code); String serialized = redisCommand.getHashKV(RedisKey.getSysDicHashKeyByOrgi(orgi), code);
if (serialized != null) { if (serialized != null) {
//noinspection unchecked
return (List<SysDic>) SerializeUtil.deserialize(serialized); return (List<SysDic>) SerializeUtil.deserialize(serialized);
} }
return null; return null;
@ -724,6 +630,7 @@ public class Cache {
public <T extends Serializable> T findOneSystemByIdAndOrgi(final String id, final String orgi) { public <T extends Serializable> T findOneSystemByIdAndOrgi(final String id, final String orgi) {
String serialized = redisCommand.getHashKV(RedisKey.getSystemHashKeyByOrgi(orgi), id); String serialized = redisCommand.getHashKV(RedisKey.getSystemHashKeyByOrgi(orgi), id);
if (StringUtils.isNotBlank(serialized)) { if (StringUtils.isNotBlank(serialized)) {
//noinspection unchecked
return (T) SerializeUtil.deserialize(serialized); return (T) SerializeUtil.deserialize(serialized);
} }
return null; return null;
@ -732,6 +639,7 @@ public class Cache {
public <T extends Serializable> List<T> findOneSystemListByIdAndOrgi(final String id, final String orgi) { public <T extends Serializable> List<T> findOneSystemListByIdAndOrgi(final String id, final String orgi) {
String serialized = redisCommand.getHashKV(RedisKey.getSystemHashKeyByOrgi(orgi), id); String serialized = redisCommand.getHashKV(RedisKey.getSystemHashKeyByOrgi(orgi), id);
if (StringUtils.isNotBlank(serialized)) { if (StringUtils.isNotBlank(serialized)) {
//noinspection unchecked
return (List<T>) SerializeUtil.deserialize(serialized); return (List<T>) SerializeUtil.deserialize(serialized);
} }
return null; return null;
@ -740,6 +648,7 @@ public class Cache {
public <TK, TV extends Serializable> Map<TK, TV> findOneSystemMapByIdAndOrgi(final String id, final String orgi) { public <TK, TV extends Serializable> Map<TK, TV> findOneSystemMapByIdAndOrgi(final String id, final String orgi) {
String serialized = redisCommand.getHashKV(RedisKey.getSystemHashKeyByOrgi(orgi), id); String serialized = redisCommand.getHashKV(RedisKey.getSystemHashKeyByOrgi(orgi), id);
if (StringUtils.isNotBlank(serialized)) { if (StringUtils.isNotBlank(serialized)) {
//noinspection unchecked
return (Map<TK, TV>) SerializeUtil.deserialize(serialized); return (Map<TK, TV>) SerializeUtil.deserialize(serialized);
} }
return null; return null;
@ -781,6 +690,7 @@ public class Cache {
public List<SessionConfig> findOneSessionConfigListByOrgi(final String orgi) { public List<SessionConfig> findOneSessionConfigListByOrgi(final String orgi) {
String serialized = redisCommand.get(RedisKey.getSessionConfigList(orgi)); String serialized = redisCommand.get(RedisKey.getSessionConfigList(orgi));
if (StringUtils.isNotBlank(serialized)) { if (StringUtils.isNotBlank(serialized)) {
//noinspection unchecked
return (List<SessionConfig>) SerializeUtil.deserialize(serialized); return (List<SessionConfig>) SerializeUtil.deserialize(serialized);
} }
@ -816,7 +726,7 @@ public class Cache {
if (StringUtils.isBlank(serialized)) { if (StringUtils.isBlank(serialized)) {
return Optional.empty(); return Optional.empty();
} }
return Optional.ofNullable((AgentUserAudit) SerializeUtil.deserialize(serialized)); return Optional.ofNullable(SerializeUtil.deserialize(serialized));
} }
public boolean existAgentUserAuditByOrgiAndId(final String orgi, final String agentUserId) { public boolean existAgentUserAuditByOrgiAndId(final String orgi, final String agentUserId) {
@ -824,16 +734,13 @@ public class Cache {
} }
/****************************************** //******************************************
* User Session 相关 //* User Session 相关
******************************************/ //******************************************
/** /**
* 存入user的session存储这组信息是为了让客户的账号只能在一个浏览器内登录使用 * 存入user的session存储这组信息是为了让客户的账号只能在一个浏览器内登录使用
* 如果一个用户账号在多个浏览器使用则登出之前的登录只保留最后一个登录正常使用 * 如果一个用户账号在多个浏览器使用则登出之前的登录只保留最后一个登录正常使用
*
* @param agentno
* @param sessionId
* @param orgi
*/ */
public void putUserSessionByAgentnoAndSessionIdAndOrgi(final String agentno, final String sessionId, final String orgi) { public void putUserSessionByAgentnoAndSessionIdAndOrgi(final String agentno, final String sessionId, final String orgi) {
redisCommand.setHashKV(RedisKey.getUserSessionKeyByOrgi(orgi), agentno, sessionId); redisCommand.setHashKV(RedisKey.getUserSessionKeyByOrgi(orgi), agentno, sessionId);

View File

@ -37,10 +37,10 @@ import com.chatopera.cc.util.Menu;
import com.google.gson.JsonArray; import com.google.gson.JsonArray;
import com.google.gson.JsonObject; import com.google.gson.JsonObject;
import com.google.gson.JsonParser; import com.google.gson.JsonParser;
import lombok.RequiredArgsConstructor;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders; import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
@ -48,6 +48,7 @@ import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.server.ResponseStatusException;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.validation.Valid; import javax.validation.Valid;
@ -59,50 +60,47 @@ import java.util.List;
*/ */
@RestController @RestController
@RequestMapping("/api/agentuser") @RequestMapping("/api/agentuser")
@RequiredArgsConstructor
public class ApiAgentUserController extends Handler { public class ApiAgentUserController extends Handler {
private final static Logger logger = LoggerFactory.getLogger(ApiAgentUserController.class); private final static Logger logger = LoggerFactory.getLogger(ApiAgentUserController.class);
@Autowired @org.springframework.lang.NonNull
private ACDMessageHelper acdMessageHelper; private final ACDMessageHelper acdMessageHelper;
@Autowired @org.springframework.lang.NonNull
private AgentUserProxy agentUserProxy; private final AgentUserProxy agentUserProxy;
@Autowired @org.springframework.lang.NonNull
private ACDAgentService acdAgentService; private final ACDAgentService acdAgentService;
@Autowired @org.springframework.lang.NonNull
private Cache cache; private final Cache cache;
@Autowired @org.springframework.lang.NonNull
private PeerSyncIM peerSyncIM; private final PeerSyncIM peerSyncIM;
@Autowired @org.springframework.lang.NonNull
private AgentUserRepository agentUserRes; private final AgentUserRepository agentUserRes;
@Autowired @org.springframework.lang.NonNull
private UserRepository userRes; private final UserRepository userRes;
@Autowired @org.springframework.lang.NonNull
private AgentServiceRepository agentServiceRes; private final AgentServiceRepository agentServiceRes;
@Autowired @org.springframework.lang.NonNull
private ACDAgentDispatcher acdAgentDispatcher; private final ACDAgentDispatcher acdAgentDispatcher;
/** /**
* 获取当前对话中的访客 * 获取当前对话中的访客
* 坐席相关 RestAPI * 坐席相关 RestAPI
*
* @param request
* @return
*/ */
@RequestMapping(method = RequestMethod.POST) @RequestMapping(method = RequestMethod.POST)
@Menu(type = "apps", subtype = "agentuser", access = true) @Menu(type = "apps", subtype = "agentuser", access = true)
public ResponseEntity<String> operations(HttpServletRequest request, @RequestBody final String body, @Valid String q) { public ResponseEntity<String> operations(HttpServletRequest request, @RequestBody final String body, @Valid String q) {
logger.info("[operations] body {}, q {}", body, q); logger.info("[operations] body {}, q {}", body, q);
final JsonObject j = StringUtils.isBlank(body) ? (new JsonObject()) : (new JsonParser()).parse( final JsonObject j = StringUtils.isBlank(body) ? new JsonObject() : JsonParser.parseString(body).getAsJsonObject();
body).getAsJsonObject();
JsonObject json = new JsonObject(); JsonObject json = new JsonObject();
HttpHeaders headers = RestUtils.header(); HttpHeaders headers = RestUtils.header();
@ -112,10 +110,10 @@ public class ApiAgentUserController extends Handler {
} else { } else {
switch (StringUtils.lowerCase(j.get("ops").getAsString())) { switch (StringUtils.lowerCase(j.get("ops").getAsString())) {
case "inserv": case "inserv":
json = inserv(request, j); json = inserv(request);
break; break;
case "withdraw": case "withdraw":
json = withdraw(request, j); json = withdraw(request);
break; break;
case "end": case "end":
json = end(request, j); json = end(request, j);
@ -129,24 +127,20 @@ public class ApiAgentUserController extends Handler {
} }
} }
return new ResponseEntity<String>(json.toString(), headers, HttpStatus.OK); return new ResponseEntity<>(json.toString(), headers, HttpStatus.OK);
} }
/** /**
* 执行坐席转接 * 执行坐席转接
* 将会话转接给别人 * 将会话转接给别人
*
* @param request
* @param payload
* @return
*/ */
private JsonObject transout(final HttpServletRequest request, final JsonObject payload) { private JsonObject transout(final HttpServletRequest request, final JsonObject payload) {
logger.info("[transout] payload ", payload.toString()); logger.info("[transout] payload {}", payload.toString());
final String orgi = super.getOrgi(request); final String orgi = super.getOrgi(request);
final User logined = super.getUser(request); final User logined = super.getUser(request);
JsonObject resp = new JsonObject(); JsonObject resp = new JsonObject();
/** /*
* 必填参数 * 必填参数
*/ */
// 目标坐席 // 目标坐席
@ -159,16 +153,16 @@ public class ApiAgentUserController extends Handler {
if (StringUtils.isNotBlank(agentUserId) && if (StringUtils.isNotBlank(agentUserId) &&
StringUtils.isNotBlank(transAgentId) && StringUtils.isNotBlank(transAgentId) &&
StringUtils.isNotBlank(agentServiceId)) { StringUtils.isNotBlank(agentServiceId)) {
final User targetAgent = userRes.findOne(transAgentId); final User targetAgent = userRes.findById(transAgentId)
.orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, String.format("Agent %s not found", transAgentId)));
final AgentService agentService = agentServiceRes.findByIdAndOrgi(agentServiceId, orgi); final AgentService agentService = agentServiceRes.findByIdAndOrgi(agentServiceId, orgi);
/** /*
* 更新AgentUser * 更新AgentUser
*/ */
final AgentUser agentUser = agentUserProxy.findOne(agentUserId).orElseGet(null); final AgentUser agentUser = agentUserProxy.findOne(agentUserId).orElse(null);
if (agentUser != null) { if (agentUser != null) {
final AgentUserAudit agentAudits = cache.findOneAgentUserAuditByOrgiAndId(orgi, agentUserId).orElseGet( final AgentUserAudit agentAudits = cache.findOneAgentUserAuditByOrgiAndId(orgi, agentUserId).orElse(null);
null);
// 当前服务于访客的坐席 // 当前服务于访客的坐席
final String currentAgentno = agentUser.getAgentno(); final String currentAgentno = agentUser.getAgentno();
@ -196,7 +190,7 @@ public class ApiAgentUserController extends Handler {
agentUser.setAgentname(targetAgent.getUname()); agentUser.setAgentname(targetAgent.getUname());
agentUserRes.save(agentUser); agentUserRes.save(agentUser);
/** /*
* 坐席状态 * 坐席状态
*/ */
// 转接目标坐席 // 转接目标坐席
@ -254,8 +248,8 @@ public class ApiAgentUserController extends Handler {
// 该登录用户可能是坐席监控或当前坐席那么如果是坐席监控就有必要 // 该登录用户可能是坐席监控或当前坐席那么如果是坐席监控就有必要
// 通知前坐席这个事件 // 通知前坐席这个事件
peerSyncIM.send(ReceiverType.AGENT, ChannelType.WEBIM, agentUser.getAppid(), peerSyncIM.send(ReceiverType.AGENT, ChannelType.WEBIM, agentUser.getAppid(),
MessageType.TRANSOUT, MessageType.TRANSOUT,
currentAgentno, outMessage, true); currentAgentno, outMessage, true);
} }
} }
@ -286,10 +280,6 @@ public class ApiAgentUserController extends Handler {
/** /**
* 结束对话 * 结束对话
* 如果当前对话属于登录用户或登录用户为超级用户则可以结束这个对话 * 如果当前对话属于登录用户或登录用户为超级用户则可以结束这个对话
*
* @param request
* @param payload
* @return
*/ */
private JsonObject end(final HttpServletRequest request, final JsonObject payload) { private JsonObject end(final HttpServletRequest request, final JsonObject payload) {
logger.info("[end] payload {}", payload.toString()); logger.info("[end] payload {}", payload.toString());
@ -326,12 +316,8 @@ public class ApiAgentUserController extends Handler {
/** /**
* 撤退一个坐席 * 撤退一个坐席
* 将当前坐席服务中的访客分配给其他就绪的坐席 * 将当前坐席服务中的访客分配给其他就绪的坐席
*
* @param request
* @param j
* @return
*/ */
private JsonObject withdraw(final HttpServletRequest request, final JsonObject j) { private JsonObject withdraw(final HttpServletRequest request) {
JsonObject resp = new JsonObject(); JsonObject resp = new JsonObject();
ACDComposeContext ctx = new ACDComposeContext(); ACDComposeContext ctx = new ACDComposeContext();
ctx.setAgentno(super.getUser(request).getId()); ctx.setAgentno(super.getUser(request).getId());
@ -345,12 +331,8 @@ public class ApiAgentUserController extends Handler {
/** /**
* 获得当前访客服务中的访客信息 * 获得当前访客服务中的访客信息
* 获取当前正在对话的访客信息包含多种渠道来源的访客 * 获取当前正在对话的访客信息包含多种渠道来源的访客
*
* @param request
* @param j
* @return
*/ */
private JsonObject inserv(final HttpServletRequest request, final JsonObject j) { private JsonObject inserv(final HttpServletRequest request) {
JsonObject resp = new JsonObject(); JsonObject resp = new JsonObject();
JsonArray data = new JsonArray(); JsonArray data = new JsonArray();
@ -374,15 +356,8 @@ public class ApiAgentUserController extends Handler {
/** /**
* 检查是否具备该会话的坐席监控权限 * 检查是否具备该会话的坐席监控权限
*
* @param agentUserAudit
* @param user
* @return
*/ */
private boolean isTransPermissionAllowed(final AgentUserAudit agentUserAudit, final User user) { private boolean isTransPermissionAllowed(final AgentUserAudit agentUserAudit, final User user) {
if (agentUserAudit != null && agentUserAudit.getSubscribers().containsKey(user.getId())) { return agentUserAudit != null && agentUserAudit.getSubscribers().containsKey(user.getId());
return true;
}
return false;
} }
} }

View File

@ -618,7 +618,7 @@ public class AgentAuditController extends Handler {
payload.put("orgi", orgi); payload.put("orgi", orgi);
ModelAndView view = end(request, agentuserid); ModelAndView view = end(request, agentuserid);
// 更新或创建黑名单 // 更新或创建黑名单
blackEntityProxy.updateOrCreateBlackEntity(blackEntity, logined, userid, orgi, agentserviceid, agentuserid); blackEntityProxy.updateOrCreateBlackEntity(blackEntity, logined, userid, orgi, agentserviceid);
// 创建定时任务 取消拉黑 // 创建定时任务 取消拉黑
brokerPublisher.send( brokerPublisher.send(

View File

@ -748,7 +748,7 @@
ModelAndView view = end(request, agentuserid); ModelAndView view = end(request, agentuserid);
// 更新或创建黑名单 // 更新或创建黑名单
blackEntityProxy.updateOrCreateBlackEntity(blackEntity, logined, userid, orgi, agentserviceid, agentuserid); blackEntityProxy.updateOrCreateBlackEntity(blackEntity, logined, userid, orgi, agentserviceid);
// 创建定时任务 取消拉黑 // 创建定时任务 取消拉黑
brokerPublisher.send( brokerPublisher.send(

View File

@ -23,9 +23,10 @@ import com.chatopera.cc.model.*;
import com.chatopera.cc.persistence.repository.*; import com.chatopera.cc.persistence.repository.*;
import com.chatopera.cc.proxy.OnlineUserProxy; import com.chatopera.cc.proxy.OnlineUserProxy;
import com.chatopera.cc.util.Menu; import com.chatopera.cc.util.Menu;
import lombok.RequiredArgsConstructor;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.lang.NonNull;
import org.springframework.stereotype.Controller; import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap; import org.springframework.ui.ModelMap;
import org.springframework.util.FileCopyUtils; import org.springframework.util.FileCopyUtils;
@ -41,32 +42,32 @@ import java.io.IOException;
import java.io.UnsupportedEncodingException; import java.io.UnsupportedEncodingException;
import java.net.URLDecoder; import java.net.URLDecoder;
import java.net.URLEncoder; import java.net.URLEncoder;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
@Controller @Controller
@RequestMapping("/apps/tenant") @RequestMapping("/apps/tenant")
@RequiredArgsConstructor
public class TenantController extends Handler { public class TenantController extends Handler {
@Autowired @NonNull
private TenantRepository tenantRes; private final TenantRepository tenantRes;
@Autowired @NonNull
private OrgiSkillRelRepository orgiSkillRelRes; private final OrgiSkillRelRepository orgiSkillRelRes;
@Autowired @NonNull
private OrganRepository organRes; private final OrganRepository organRes;
@Autowired @NonNull
private OrganizationRepository organizationRes; private final OrganizationRepository organizationRes;
@Autowired @NonNull
private AgentUserRepository agentUserRepository; private final AgentUserRepository agentUserRepository;
@Autowired @NonNull
private Cache cache; private final Cache cache;
@Value("${web.upload-path}") @Value("${web.upload-path}")
private String path; private String path;
@ -87,7 +88,7 @@ public class TenantController extends Handler {
new ArrayList<>((super.getUser(request)).getAffiliates())); new ArrayList<>((super.getUser(request)).getAffiliates()));
List<Tenant> tenantList = null; List<Tenant> tenantList = null;
if (!orgiSkillRelList.isEmpty()) { if (!orgiSkillRelList.isEmpty()) {
tenantList = new ArrayList<Tenant>(); tenantList = new ArrayList<>();
for (OrgiSkillRel orgiSkillRel : orgiSkillRelList) { for (OrgiSkillRel orgiSkillRel : orgiSkillRelList) {
Tenant t = tenantRes.findById(orgiSkillRel.getOrgi()); Tenant t = tenantRes.findById(orgiSkillRel.getOrgi());
if (t != null) { if (t != null) {
@ -123,15 +124,16 @@ public class TenantController extends Handler {
@RequestMapping("/save") @RequestMapping("/save")
@Menu(type = "apps", subtype = "tenant") @Menu(type = "apps", subtype = "tenant")
public ModelAndView save(HttpServletRequest request, @Valid Tenant tenant, @RequestParam(value = "tenantpic", required = false) MultipartFile tenantpic, @Valid String skills) throws NoSuchAlgorithmException, IOException { public ModelAndView save(HttpServletRequest request, @Valid Tenant tenant, @RequestParam(value = "tenantpic", required = false) MultipartFile tenantpic, @Valid String skills) throws IOException {
Tenant tenanttemp = tenantRes.findByOrgidAndTenantname(super.getOrgid(request), tenant.getTenantname()); Tenant tenanttemp = tenantRes.findByOrgidAndTenantname(super.getOrgid(request), tenant.getTenantname());
if (tenanttemp != null) { if (tenanttemp != null) {
return request(super.createRequestPageTempletResponse("redirect:/apps/tenant/index.html?msg=tenantexist")); return request(super.createRequestPageTempletResponse("redirect:/apps/tenant/index.html?msg=tenantexist"));
} }
tenantRes.save(tenant); tenantRes.save(tenant);
if (tenantpic != null && tenantpic.getOriginalFilename().lastIndexOf(".") > 0) { if (tenantpic != null && tenantpic.getOriginalFilename() != null && tenantpic.getOriginalFilename().lastIndexOf(".") > 0) {
File logoDir = new File(path, "tenantpic"); File logoDir = new File(path, "tenantpic");
if (!logoDir.exists()) { if (!logoDir.exists()) {
//noinspection ResultOfMethodCallIgnored
logoDir.mkdirs(); logoDir.mkdirs();
} }
String fileName = "tenantpic/" + tenant.getId() + tenantpic.getOriginalFilename().substring( String fileName = "tenantpic/" + tenant.getId() + tenantpic.getOriginalFilename().substring(
@ -141,7 +143,7 @@ public class TenantController extends Handler {
} }
String tenantid = tenant.getId(); String tenantid = tenant.getId();
List<OrgiSkillRel> orgiSkillRelList = orgiSkillRelRes.findByOrgi(tenantid); List<OrgiSkillRel> orgiSkillRelList = orgiSkillRelRes.findByOrgi(tenantid);
orgiSkillRelRes.delete(orgiSkillRelList); orgiSkillRelRes.deleteAll(orgiSkillRelList);
if (!StringUtils.isBlank(skills)) { if (!StringUtils.isBlank(skills)) {
String[] skillsarray = skills.split(","); String[] skillsarray = skills.split(",");
for (String skill : skillsarray) { for (String skill : skillsarray) {
@ -180,53 +182,52 @@ public class TenantController extends Handler {
@RequestMapping("/update") @RequestMapping("/update")
@Menu(type = "apps", subtype = "tenant", admin = true) @Menu(type = "apps", subtype = "tenant", admin = true)
public ModelAndView update(HttpServletRequest request, @Valid Tenant tenant, @RequestParam(value = "tenantpic", required = false) MultipartFile tenantpic, @Valid String skills) throws NoSuchAlgorithmException, IOException { public ModelAndView update(HttpServletRequest request, @NonNull @Valid Tenant tenant, @RequestParam(value = "tenantpic", required = false) MultipartFile tenantpic, @Valid String skills) throws IOException {
Tenant temp = tenantRes.findById(tenant.getId()); Tenant temp = tenantRes.findById(tenant.getId());
Tenant tenanttemp = tenantRes.findByOrgidAndTenantname(super.getOrgid(request), tenant.getTenantname()); Tenant tenanttemp = tenantRes.findByOrgidAndTenantname(super.getOrgid(request), tenant.getTenantname());
if (temp != null && tenanttemp != null && !temp.getId().equals(tenanttemp.getId())) { if (temp != null && tenanttemp != null && !temp.getId().equals(tenanttemp.getId())) {
return request(super.createRequestPageTempletResponse("redirect:/apps/tenant/index.html?msg=tenantexist")); return request(super.createRequestPageTempletResponse("redirect:/apps/tenant/index.html?msg=tenantexist"));
} }
if (tenant != null) { tenant.setCreatetime(temp.getCreatetime());
tenant.setCreatetime(temp.getCreatetime()); if (tenantpic != null && tenantpic.getOriginalFilename() != null && tenantpic.getOriginalFilename().lastIndexOf(".") > 0) {
if (tenantpic != null && tenantpic.getOriginalFilename().lastIndexOf(".") > 0) { File logoDir = new File(path, "tenantpic");
File logoDir = new File(path, "tenantpic"); if (!logoDir.exists()) {
if (!logoDir.exists()) { //noinspection ResultOfMethodCallIgnored
logoDir.mkdirs(); logoDir.mkdirs();
}
String fileName = "tenantpic/" + tenant.getId() + tenantpic.getOriginalFilename().substring(
tenantpic.getOriginalFilename().lastIndexOf("."));
FileCopyUtils.copy(tenantpic.getBytes(), new File(path, fileName));
tenant.setTenantlogo(fileName);
} else {
tenant.setTenantlogo(temp.getTenantlogo());
} }
if (!StringUtils.isBlank(super.getUser(request).getOrgid())) { String fileName = "tenantpic/" + tenant.getId() + tenantpic.getOriginalFilename().substring(
tenant.setOrgid(super.getUser(request).getOrgid()); tenantpic.getOriginalFilename().lastIndexOf("."));
} else { FileCopyUtils.copy(tenantpic.getBytes(), new File(path, fileName));
tenant.setOrgid(MainContext.SYSTEM_ORGI); tenant.setTenantlogo(fileName);
} } else {
tenantRes.save(tenant); tenant.setTenantlogo(temp.getTenantlogo());
List<OrgiSkillRel> orgiSkillRelList = orgiSkillRelRes.findByOrgi(tenant.getId());
orgiSkillRelRes.delete(orgiSkillRelList);
if (!StringUtils.isBlank(skills)) {
String[] skillsarray = skills.split(",");
for (String skill : skillsarray) {
OrgiSkillRel rel = new OrgiSkillRel();
rel.setOrgi(tenant.getId());
rel.setSkillid(skill);
rel.setCreater(super.getUser(request).getId());
rel.setCreatetime(new Date());
orgiSkillRelRes.save(rel);
}
}
OnlineUserProxy.clean(tenant.getId());
} }
if (!StringUtils.isBlank(super.getUser(request).getOrgid())) {
tenant.setOrgid(super.getUser(request).getOrgid());
} else {
tenant.setOrgid(MainContext.SYSTEM_ORGI);
}
tenantRes.save(tenant);
List<OrgiSkillRel> orgiSkillRelList = orgiSkillRelRes.findByOrgi(tenant.getId());
orgiSkillRelRes.deleteAll(orgiSkillRelList);
if (!StringUtils.isBlank(skills)) {
String[] skillsarray = skills.split(",");
for (String skill : skillsarray) {
OrgiSkillRel rel = new OrgiSkillRel();
rel.setOrgi(tenant.getId());
rel.setSkillid(skill);
rel.setCreater(super.getUser(request).getId());
rel.setCreatetime(new Date());
orgiSkillRelRes.save(rel);
}
}
OnlineUserProxy.clean(tenant.getId());
return request(super.createRequestPageTempletResponse("redirect:/apps/tenant/index")); return request(super.createRequestPageTempletResponse("redirect:/apps/tenant/index"));
} }
@RequestMapping("/delete") @RequestMapping("/delete")
@Menu(type = "apps", subtype = "tenant") @Menu(type = "apps", subtype = "tenant")
public ModelAndView delete(HttpServletRequest request, @Valid Tenant tenant) { public ModelAndView delete(@Valid Tenant tenant) {
Tenant temp = tenantRes.findById(tenant.getId()); Tenant temp = tenantRes.findById(tenant.getId());
if (tenant != null) { if (tenant != null) {
tenantRes.delete(temp); tenantRes.delete(temp);

View File

@ -32,127 +32,124 @@ import com.chatopera.cc.socketio.message.Message;
import com.chatopera.cc.util.IP; import com.chatopera.cc.util.IP;
import com.chatopera.cc.util.IPTools; import com.chatopera.cc.util.IPTools;
import com.chatopera.cc.util.Menu; import com.chatopera.cc.util.Menu;
import lombok.RequiredArgsConstructor;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page; import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort.Direction; import org.springframework.data.domain.Sort.Direction;
import org.springframework.data.jpa.domain.Specification; import org.springframework.data.jpa.domain.Specification;
import org.springframework.http.HttpStatus;
import org.springframework.lang.NonNull;
import org.springframework.stereotype.Controller; import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap; import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.server.ResponseStatusException;
import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.ModelAndView;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.validation.Valid; import javax.validation.Valid;
import java.nio.charset.CharacterCodingException;
import java.text.ParseException; import java.text.ParseException;
import java.util.*; import java.util.*;
@Controller @Controller
@RequestMapping("/service") @RequestMapping("/service")
@RequiredArgsConstructor
public class ChatServiceController extends Handler { public class ChatServiceController extends Handler {
private final static Logger logger = LoggerFactory.getLogger(ChatServiceController.class); private final static Logger logger = LoggerFactory.getLogger(ChatServiceController.class);
@Autowired @NonNull
private AgentUserProxy agentUserProxy; private final AgentUserProxy agentUserProxy;
@Autowired @NonNull
private AgentStatusProxy agentStatusProxy; private final AgentStatusProxy agentStatusProxy;
@Autowired @NonNull
private ACDAgentService acdAgentService; private final ACDAgentService acdAgentService;
@Autowired @NonNull
private ACDVisitorDispatcher acdVisitorDispatcher; private final ACDVisitorDispatcher acdVisitorDispatcher;
@Autowired @NonNull
private AgentServiceRepository agentServiceRes; private final AgentServiceRepository agentServiceRes;
@Autowired @NonNull
private AgentUserRepository agentUserRes; private final AgentUserRepository agentUserRes;
@Autowired @NonNull
private AgentStatusRepository agentStatusRepository; private final AgentStatusRepository agentStatusRepository;
@Autowired @NonNull
private AgentUserRepository agentUserRepository; private final AgentUserRepository agentUserRepository;
@Autowired @NonNull
private LeaveMsgRepository leaveMsgRes; private final LeaveMsgRepository leaveMsgRes;
@Autowired @NonNull
private LeaveMsgProxy leaveMsgProxy; private final LeaveMsgProxy leaveMsgProxy;
@Autowired @NonNull
private OrganRepository organRes; private final OrganRepository organRes;
@Autowired @NonNull
private OrganRepository organ; private final OrganRepository organ;
@Autowired @NonNull
private UserRepository user; private final UserRepository user;
@Autowired @NonNull
private UserRepository userRes; private final UserRepository userRes;
@Autowired @NonNull
private OrgiSkillRelRepository orgiSkillRelService; private final OrgiSkillRelRepository orgiSkillRelService;
@Autowired @NonNull
private UserProxy userProxy; private final UserProxy userProxy;
@Autowired @NonNull
private Cache cache; private final Cache cache;
@Autowired @NonNull
private PeerSyncIM peerSyncIM; private final PeerSyncIM peerSyncIM;
@Autowired @NonNull
private ACDMessageHelper acdMessageHelper; private final ACDMessageHelper acdMessageHelper;
@RequestMapping("/history/index") @RequestMapping("/history/index")
@Menu(type = "service", subtype = "history", admin = true) @Menu(type = "service", subtype = "history", admin = true)
public ModelAndView index(ModelMap map, HttpServletRequest request, final String username, final String channel, final String servicetype, final String allocation, final String servicetimetype, final String begin, final String end) { public ModelAndView index(ModelMap map, HttpServletRequest request, final String username, final String channel, final String servicetype, final String allocation, final String servicetimetype, final String begin, final String end) {
Page<AgentService> page = agentServiceRes.findAll(new Specification<AgentService>() { Page<AgentService> page = agentServiceRes.findAll((Specification<AgentService>) (root, query, cb) -> {
@Override List<Predicate> list = new ArrayList<>();
public Predicate toPredicate(Root<AgentService> root, CriteriaQuery<?> query, CriteriaBuilder cb) { if (StringUtils.isNotBlank(username)) {
List<Predicate> list = new ArrayList<Predicate>(); list.add(cb.equal(root.get("username").as(String.class), username));
if (StringUtils.isNotBlank(username)) {
list.add(cb.equal(root.get("username").as(String.class), username));
}
if (StringUtils.isNotBlank(channel)) {
list.add(cb.equal(root.get("channel").as(String.class), channel));
}
if (StringUtils.isNotBlank(servicetype) && StringUtils.isNotBlank(allocation)) {
list.add(cb.equal(root.get(servicetype).as(String.class), allocation));
}
if (StringUtils.isNotBlank(servicetimetype)) {
try {
if (StringUtils.isNotBlank(begin) && begin.matches("[\\d]{4}-[\\d]{2}-[\\d]{2}")) {
list.add(cb.greaterThanOrEqualTo(
root.get(servicetimetype).as(Date.class),
MainUtils.simpleDateFormat.parse(begin)));
}
if (StringUtils.isNotBlank(end) && end.matches("[\\d]{4}-[\\d]{2}-[\\d]{2}")) {
list.add(cb.lessThanOrEqualTo(
root.get(servicetimetype).as(Date.class),
MainUtils.dateFormate.parse(end + " 23:59:59")));
}
} catch (ParseException e) {
e.printStackTrace();
}
}
Predicate[] p = new Predicate[list.size()];
return cb.and(list.toArray(p));
} }
if (StringUtils.isNotBlank(channel)) {
list.add(cb.equal(root.get("channel").as(String.class), channel));
}
if (StringUtils.isNotBlank(servicetype) && StringUtils.isNotBlank(allocation)) {
list.add(cb.equal(root.get(servicetype).as(String.class), allocation));
}
if (StringUtils.isNotBlank(servicetimetype)) {
try {
if (StringUtils.isNotBlank(begin) && begin.matches("[\\d]{4}-[\\d]{2}-[\\d]{2}")) {
list.add(cb.greaterThanOrEqualTo(
root.get(servicetimetype).as(Date.class),
MainUtils.simpleDateFormat.parse(begin)));
}
if (StringUtils.isNotBlank(end) && end.matches("[\\d]{4}-[\\d]{2}-[\\d]{2}")) {
list.add(cb.lessThanOrEqualTo(
root.get(servicetimetype).as(Date.class),
MainUtils.dateFormate.parse(end + " 23:59:59")));
}
} catch (ParseException e) {
e.printStackTrace();
}
}
Predicate[] p = new Predicate[list.size()];
return cb.and(list.toArray(p));
}, PageRequest.of(super.getP(request), super.getPs(request), Direction.DESC, "createtime")); }, PageRequest.of(super.getP(request), super.getPs(request), Direction.DESC, "createtime"));
map.put("agentServiceList", page); map.put("agentServiceList", page);
map.put("username", username); map.put("username", username);
@ -199,7 +196,7 @@ public class ChatServiceController extends Handler {
} }
} }
List<AgentStatus> agentStatusList = cache.getAgentStatusBySkillAndOrgi(null, super.getOrgi(request)); List<AgentStatus> agentStatusList = cache.getAgentStatusBySkillAndOrgi(null, super.getOrgi(request));
List<String> usersids = new ArrayList<String>(); List<String> usersids = new ArrayList<>();
if (!agentStatusList.isEmpty()) { if (!agentStatusList.isEmpty()) {
for (AgentStatus agentStatus : agentStatusList) { for (AgentStatus agentStatus : agentStatusList) {
if (agentStatus != null) { if (agentStatus != null) {
@ -207,16 +204,18 @@ public class ChatServiceController extends Handler {
} }
} }
} }
List<User> userList = userRes.findAll(usersids); List<User> userList = userRes.findAllById(usersids);
for (User user : userList) { for (User user : userList) {
user.setAgentStatus(cache.findOneAgentStatusByAgentnoAndOrig(user.getId(), super.getOrgi(request))); user.setAgentStatus(cache.findOneAgentStatusByAgentnoAndOrig(user.getId(), super.getOrgi(request)));
userProxy.attachOrgansPropertiesForUser(user); userProxy.attachOrgansPropertiesForUser(user);
} }
map.addAttribute("userList", userList); map.addAttribute("userList", userList);
map.addAttribute("userid", agentService.getUserid()); if (agentService != null) {
map.addAttribute("agentserviceid", agentService.getId()); map.addAttribute("userid", agentService.getUserid());
map.addAttribute("agentuserid", agentService.getAgentuserid()); map.addAttribute("agentserviceid", agentService.getId());
map.addAttribute("agentservice", agentService); map.addAttribute("agentuserid", agentService.getAgentuserid());
map.addAttribute("agentservice", agentService);
}
map.addAttribute("skillGroups", skillGroups); map.addAttribute("skillGroups", skillGroups);
map.addAttribute("currentorgan", currentOrgan); map.addAttribute("currentorgan", currentOrgan);
} }
@ -226,10 +225,11 @@ public class ChatServiceController extends Handler {
@RequestMapping(value = "/transfer/save") @RequestMapping(value = "/transfer/save")
@Menu(type = "apps", subtype = "transfersave") @Menu(type = "apps", subtype = "transfersave")
public ModelAndView transfersave(ModelMap map, HttpServletRequest request, @Valid String id, @Valid String agentno, @Valid String memo) throws CharacterCodingException { public ModelAndView transfersave(HttpServletRequest request, @Valid String id, @Valid String agentno, @Valid String memo) {
if (StringUtils.isNotBlank(id)) { if (StringUtils.isNotBlank(id)) {
AgentService agentService = agentServiceRes.findByIdAndOrgi(id, super.getOrgi(request)); AgentService agentService = Objects.requireNonNull(agentServiceRes.findByIdAndOrgi(id, super.getOrgi(request)));
final User targetAgent = userRes.findOne(agentno); final User targetAgent = userRes.findById(agentno)
.orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, String.format("Agent %s not found", agentno)));
AgentUser agentUser = null; AgentUser agentUser = null;
Optional<AgentUser> agentUserOpt = cache.findOneAgentUserByUserIdAndOrgi( Optional<AgentUser> agentUserOpt = cache.findOneAgentUserByUserIdAndOrgi(
agentService.getUserid(), super.getOrgi(request)); agentService.getUserid(), super.getOrgi(request));
@ -303,15 +303,13 @@ public class ChatServiceController extends Handler {
} }
} }
if (agentService != null) { agentService.setAgentno(agentno);
agentService.setAgentno(agentno); if (StringUtils.isNotBlank(memo)) {
if (StringUtils.isNotBlank(memo)) { agentService.setTransmemo(memo);
agentService.setTransmemo(memo);
}
agentService.setTrans(true);
agentService.setTranstime(new Date());
agentServiceRes.save(agentService);
} }
agentService.setTrans(true);
agentService.setTranstime(new Date());
agentServiceRes.save(agentService);
} }
return request(super.createRequestPageTempletResponse("redirect:/service/current/index.html")); return request(super.createRequestPageTempletResponse("redirect:/service/current/index.html"));
@ -319,7 +317,7 @@ public class ChatServiceController extends Handler {
@RequestMapping("/current/end") @RequestMapping("/current/end")
@Menu(type = "service", subtype = "current", admin = true) @Menu(type = "service", subtype = "current", admin = true)
public ModelAndView end(ModelMap map, HttpServletRequest request, @Valid String id) throws Exception { public ModelAndView end(HttpServletRequest request, @Valid String id) throws Exception {
if (StringUtils.isNotBlank(id)) { if (StringUtils.isNotBlank(id)) {
AgentService agentService = agentServiceRes.findByIdAndOrgi(id, super.getOrgi(request)); AgentService agentService = agentServiceRes.findByIdAndOrgi(id, super.getOrgi(request));
if (agentService != null) { if (agentService != null) {
@ -338,19 +336,12 @@ public class ChatServiceController extends Handler {
/** /**
* 邀请 * 邀请
*
* @param map
* @param request
* @param id
* @return
* @throws Exception
*/ */
@RequestMapping("/current/invite") @RequestMapping("/current/invite")
@Menu(type = "service", subtype = "current", admin = true) @Menu(type = "service", subtype = "current", admin = true)
public ModelAndView currentinvite( public ModelAndView currentinvite(
ModelMap map,
final HttpServletRequest request, final HttpServletRequest request,
final @Valid String id) throws Exception { final @Valid String id) {
if (StringUtils.isNotBlank(id)) { if (StringUtils.isNotBlank(id)) {
AgentService agentService = agentServiceRes.findByIdAndOrgi(id, super.getOrgi(request)); AgentService agentService = agentServiceRes.findByIdAndOrgi(id, super.getOrgi(request));
if (agentService != null) { if (agentService != null) {
@ -402,7 +393,7 @@ public class ChatServiceController extends Handler {
Page<AgentUser> agentUserList = agentUserRes.findByOrgiAndStatus( Page<AgentUser> agentUserList = agentUserRes.findByOrgiAndStatus(
super.getOrgi(request), MainContext.AgentUserStatusEnum.INQUENE.toString(), super.getOrgi(request), MainContext.AgentUserStatusEnum.INQUENE.toString(),
PageRequest.of(super.getP(request), super.getPs(request), Direction.DESC, "createtime")); PageRequest.of(super.getP(request), super.getPs(request), Direction.DESC, "createtime"));
List<String> skillGroups = new ArrayList<String>(); List<String> skillGroups = new ArrayList<>();
for (AgentUser agentUser : agentUserList.getContent()) { for (AgentUser agentUser : agentUserList.getContent()) {
agentUser.setWaittingtime((int) (System.currentTimeMillis() - agentUser.getCreatetime().getTime())); agentUser.setWaittingtime((int) (System.currentTimeMillis() - agentUser.getCreatetime().getTime()));
if (StringUtils.isNotBlank(agentUser.getSkill())) { if (StringUtils.isNotBlank(agentUser.getSkill())) {
@ -410,7 +401,7 @@ public class ChatServiceController extends Handler {
} }
} }
if (skillGroups.size() > 0) { if (skillGroups.size() > 0) {
List<Organ> organList = organRes.findAll(skillGroups); List<Organ> organList = organRes.findAllById(skillGroups);
for (AgentUser agentUser : agentUserList.getContent()) { for (AgentUser agentUser : agentUserList.getContent()) {
if (StringUtils.isNotBlank(agentUser.getSkill())) { if (StringUtils.isNotBlank(agentUser.getSkill())) {
for (Organ organ : organList) { for (Organ organ : organList) {
@ -428,7 +419,7 @@ public class ChatServiceController extends Handler {
@RequestMapping("/quene/clean") @RequestMapping("/quene/clean")
@Menu(type = "service", subtype = "queneclean", admin = true) @Menu(type = "service", subtype = "queneclean", admin = true)
public ModelAndView clean(ModelMap map, HttpServletRequest request, @Valid String id) { public ModelAndView clean(HttpServletRequest request, @Valid String id) {
AgentUser agentUser = agentUserRes.findByIdAndOrgi(id, super.getOrgi(request)); AgentUser agentUser = agentUserRes.findByIdAndOrgi(id, super.getOrgi(request));
if (agentUser != null && agentUser.getStatus().equals(MainContext.AgentUserStatusEnum.INQUENE.toString())) { if (agentUser != null && agentUser.getStatus().equals(MainContext.AgentUserStatusEnum.INQUENE.toString())) {
agentUser.setAgentno(null); agentUser.setAgentno(null);
@ -443,7 +434,7 @@ public class ChatServiceController extends Handler {
@RequestMapping("/quene/invite") @RequestMapping("/quene/invite")
@Menu(type = "service", subtype = "invite", admin = true) @Menu(type = "service", subtype = "invite", admin = true)
public ModelAndView invite(ModelMap map, HttpServletRequest request, @Valid String id) throws Exception { public ModelAndView invite(HttpServletRequest request, @Valid String id) {
final User logined = super.getUser(request); final User logined = super.getUser(request);
final String orgi = logined.getOrgi(); final String orgi = logined.getOrgi();
AgentUser agentUser = agentUserRes.findByIdAndOrgi(id, super.getOrgi(request)); AgentUser agentUser = agentUserRes.findByIdAndOrgi(id, super.getOrgi(request));
@ -455,10 +446,6 @@ public class ChatServiceController extends Handler {
/** /**
* 管理员查看在线坐席 * 管理员查看在线坐席
*
* @param map
* @param request
* @return
*/ */
@RequestMapping("/agent/index") @RequestMapping("/agent/index")
@Menu(type = "service", subtype = "onlineagent", admin = true) @Menu(type = "service", subtype = "onlineagent", admin = true)
@ -476,21 +463,16 @@ public class ChatServiceController extends Handler {
/** /**
* 查看离线坐席 * 查看离线坐席
*
* @param map
* @param request
* @param id
* @return
*/ */
@RequestMapping("/agent/offline") @RequestMapping("/agent/offline")
@Menu(type = "service", subtype = "offline", admin = true) @Menu(type = "service", subtype = "offline", admin = true)
public ModelAndView offline(ModelMap map, HttpServletRequest request, @Valid String id) { public ModelAndView offline(HttpServletRequest request, @Valid String id) {
AgentStatus agentStatus = agentStatusRepository.findByIdAndOrgi(id, super.getOrgi(request)); AgentStatus agentStatus = agentStatusRepository.findByIdAndOrgi(id, super.getOrgi(request));
if (agentStatus != null) { if (agentStatus != null) {
agentStatusRepository.delete(agentStatus); agentStatusRepository.delete(agentStatus);
cache.deleteAgentStatusByAgentnoAndOrgi(agentStatus.getAgentno(), super.getOrgi(request));
} }
cache.deleteAgentStatusByAgentnoAndOrgi(agentStatus.getAgentno(), super.getOrgi(request));
agentStatusProxy.broadcastAgentsStatus( agentStatusProxy.broadcastAgentsStatus(
super.getOrgi(request), "agent", "offline", super.getUser(request).getId()); super.getOrgi(request), "agent", "offline", super.getUser(request).getId());
@ -500,10 +482,6 @@ public class ChatServiceController extends Handler {
/** /**
* 非管理员坐席 * 非管理员坐席
*
* @param map
* @param request
* @return
*/ */
@RequestMapping("/user/index") @RequestMapping("/user/index")
@Menu(type = "service", subtype = "userlist", admin = true) @Menu(type = "service", subtype = "userlist", admin = true)
@ -552,9 +530,9 @@ public class ChatServiceController extends Handler {
@RequestMapping("/leavemsg/delete") @RequestMapping("/leavemsg/delete")
@Menu(type = "service", subtype = "leavemsg", admin = true) @Menu(type = "service", subtype = "leavemsg", admin = true)
public ModelAndView leavemsg(ModelMap map, HttpServletRequest request, @Valid String id) { public ModelAndView leavemsg(@Valid String id) {
if (StringUtils.isNotBlank(id)) { if (StringUtils.isNotBlank(id)) {
leaveMsgRes.delete(id); leaveMsgRes.deleteById(id);
} }
return request(super.createRequestPageTempletResponse("redirect:/service/leavemsg/index.html")); return request(super.createRequestPageTempletResponse("redirect:/service/leavemsg/index.html"));
} }

View File

@ -23,34 +23,34 @@ import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.domain.Specification; import org.springframework.data.jpa.domain.Specification;
import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query; import org.springframework.data.jpa.repository.Query;
import org.springframework.lang.Nullable;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
public interface AgentServiceRepository public interface AgentServiceRepository extends JpaRepository<AgentService, String> {
extends JpaRepository<AgentService, String> @Nullable
{ AgentService findByIdAndOrgi(String paramString, String orgi);
AgentService findByIdAndOrgi(String paramString, String orgi);
List<AgentService> findByUseridAndOrgiOrderByLogindateDesc(String paramString, String orgi); List<AgentService> findByUseridAndOrgiOrderByLogindateDesc(String paramString, String orgi);
@Query(value = "SELECT * FROM uk_agentservice WHERE userid= ?1 AND orgi = ?2 ORDER BY logindate DESC LIMIT 1", nativeQuery = true) @Query(value = "SELECT * FROM uk_agentservice WHERE userid= ?1 AND orgi = ?2 ORDER BY logindate DESC LIMIT 1", nativeQuery = true)
Optional<AgentService> findOneByUseridAndOrgiOrderByLogindateDesc(String userid, String orgi); Optional<AgentService> findOneByUseridAndOrgiOrderByLogindateDesc(String userid, String orgi);
AgentService findFirstByUserid(String userid); AgentService findFirstByUserid(String userid);
Page<AgentService> findByOrgi(String orgi, Pageable paramPageable); Page<AgentService> findByOrgi(String orgi, Pageable paramPageable);
Page<AgentService> findByOrgiAndSatisfaction(String orgi, boolean satisfaction, Pageable paramPageable); Page<AgentService> findByOrgiAndSatisfaction(String orgi, boolean satisfaction, Pageable paramPageable);
Page<AgentService> findByOrgiAndStatus(String orgi, String status, Pageable paramPageable); Page<AgentService> findByOrgiAndStatus(String orgi, String status, Pageable paramPageable);
List<AgentService> findByAgentnoAndStatusAndOrgi(String agentno, String status, String orgi); List<AgentService> findByAgentnoAndStatusAndOrgi(String agentno, String status, String orgi);
int countByUseridAndOrgiAndStatus(String userid, String orgi, String status); int countByUseridAndOrgiAndStatus(String userid, String orgi, String status);
List<AgentService> findByUseridAndOrgiAndStatus(String userid, String orgi, String status, Sort sort); List<AgentService> findByUseridAndOrgiAndStatus(String userid, String orgi, String status, Sort sort);
Page<AgentService> findAll(Specification<AgentService> spec, Pageable pageable); //分页按条件查询 Page<AgentService> findAll(Specification<AgentService> spec, Pageable pageable); //分页按条件查询
} }

View File

@ -33,20 +33,20 @@ public interface AgentUserRepository extends JpaRepository<AgentUser, String> {
@Query(value = "SELECT * FROM uk_agentuser WHERE userid = ?1 AND orgi = ?2 ORDER BY createtime DESC LIMIT 1", nativeQuery = true) @Query(value = "SELECT * FROM uk_agentuser WHERE userid = ?1 AND orgi = ?2 ORDER BY createtime DESC LIMIT 1", nativeQuery = true)
Optional<AgentUser> findOneByUseridAndOrgi(String userid, String orgi); Optional<AgentUser> findOneByUseridAndOrgi(String userid, String orgi);
@Query(value = "SELECT * FROM uk_agentuser WHERE userid = ?1 LIMIT 1", nativeQuery = true) // @Query(value = "SELECT * FROM uk_agentuser WHERE userid = ?1 LIMIT 1", nativeQuery = true)
AgentUser findOneByUserid(final String userid); // AgentUser findOneByUserid(final String userid);
List<AgentUser> findByUseridAndOrgi(String userid, String orgi); List<AgentUser> findByUseridAndOrgi(String userid, String orgi);
List<AgentUser> findByUseridAndStatus(String userid, String status); // List<AgentUser> findByUseridAndStatus(String userid, String status);
List<AgentUser> findByAgentnoAndOrgi(String agentno, String orgi, Sort sort); List<AgentUser> findByAgentnoAndOrgi(String agentno, String orgi, Sort sort);
List<AgentUser> findByAgentnoAndOrgi(String agentno, String orgi); // List<AgentUser> findByAgentnoAndOrgi(String agentno, String orgi);
Page<AgentUser> findByOrgiAndStatus(String orgi, String status, Pageable page); Page<AgentUser> findByOrgiAndStatus(String orgi, String status, Pageable page);
List<AgentUser> findByOrgiAndStatus(final String orgi, final String status, final Sort sort); // List<AgentUser> findByOrgiAndStatus(final String orgi, final String status, final Sort sort);
List<AgentUser> findByOrgiAndStatusAndAgentnoIsNot(final String orgi, final String status, final String agentno, final Sort sort); List<AgentUser> findByOrgiAndStatusAndAgentnoIsNot(final String orgi, final String status, final String agentno, final Sort sort);
@ -61,7 +61,7 @@ public interface AgentUserRepository extends JpaRepository<AgentUser, String> {
@Query(value = "SELECT a FROM AgentUser a WHERE a.userid in(:userids)") @Query(value = "SELECT a FROM AgentUser a WHERE a.userid in(:userids)")
List<AgentUser> findAllByUserids(@Param("userids") List<String> userids); List<AgentUser> findAllByUserids(@Param("userids") List<String> userids);
int countByAgentnoAndStatusAndOrgi(String agentno, String status, String orgi); // int countByAgentnoAndStatusAndOrgi(String agentno, String status, String orgi);
AgentUser findOneByAgentnoAndStatusAndOrgi(String id, String status, String orgi); AgentUser findOneByAgentnoAndStatusAndOrgi(String id, String status, String orgi);

View File

@ -18,53 +18,40 @@ package com.chatopera.cc.proxy;
import com.chatopera.cc.cache.Cache; import com.chatopera.cc.cache.Cache;
import com.chatopera.cc.model.AgentService; import com.chatopera.cc.model.AgentService;
import com.chatopera.cc.model.AgentUser;
import com.chatopera.cc.model.BlackEntity; import com.chatopera.cc.model.BlackEntity;
import com.chatopera.cc.model.User; import com.chatopera.cc.model.User;
import com.chatopera.cc.persistence.repository.AgentServiceRepository; import com.chatopera.cc.persistence.repository.AgentServiceRepository;
import com.chatopera.cc.persistence.repository.AgentUserRepository;
import com.chatopera.cc.persistence.repository.BlackListRepository; import com.chatopera.cc.persistence.repository.BlackListRepository;
import lombok.RequiredArgsConstructor;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.lang.NonNull;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
import java.util.Date; import java.util.Date;
@Component @Component
@RequiredArgsConstructor
public class BlackEntityProxy { public class BlackEntityProxy {
@Autowired @NonNull
private BlackListRepository blackListRes; private final BlackListRepository blackListRes;
@Autowired @NonNull
private Cache cache; private final Cache cache;
@Autowired @NonNull
private AgentUserRepository agentUserRepository; private final AgentServiceRepository agentServiceRes;
@Autowired
private AgentServiceRepository agentServiceRes;
/** /**
* 更新或创建黑名单记录 * 更新或创建黑名单记录
*
* @param pre
* @param owner
* @param userid
* @param orgi
* @param agentserviceid
* @param agentuserid
* @return
*/ */
public BlackEntity updateOrCreateBlackEntity( public void updateOrCreateBlackEntity(
final BlackEntity pre, final BlackEntity pre,
final User owner, final User owner,
final String userid, final String userid,
final String orgi, final String orgi,
final String agentserviceid, final String agentserviceid) {
final String agentuserid) {
final BlackEntity blackEntityUpdated = cache.findOneBlackEntityByUserIdAndOrgi( final BlackEntity blackEntityUpdated = cache.findOneBlackEntityByUserIdAndOrgi(
userid, orgi).orElseGet( userid, orgi).orElseGet(
() -> { () -> {
@ -102,6 +89,5 @@ public class BlackEntityProxy {
blackListRes.save(blackEntityUpdated); blackListRes.save(blackEntityUpdated);
return blackEntityUpdated;
} }
} }

View File

@ -22,12 +22,12 @@ import com.chatopera.cc.persistence.es.ContactsRepository;
import com.chatopera.cc.persistence.repository.AgentUserRepository; import com.chatopera.cc.persistence.repository.AgentUserRepository;
import com.chatopera.cc.persistence.repository.OnlineUserRepository; import com.chatopera.cc.persistence.repository.OnlineUserRepository;
import com.chatopera.cc.persistence.repository.SNSAccountRepository; import com.chatopera.cc.persistence.repository.SNSAccountRepository;
import lombok.RequiredArgsConstructor;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.domain.Page; import org.springframework.data.domain.Page;
import org.springframework.lang.NonNull;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.ui.ModelMap; import org.springframework.ui.ModelMap;
@ -37,34 +37,27 @@ import java.util.*;
* 向联系人发送消息 * 向联系人发送消息
*/ */
@Component @Component
@RequiredArgsConstructor
public class ContactsProxy { public class ContactsProxy {
private final static Logger logger = LoggerFactory.getLogger(ContactsProxy.class); private final static Logger logger = LoggerFactory.getLogger(ContactsProxy.class);
@Autowired @NonNull
private Cache cache; private final Cache cache;
@Autowired @NonNull
private AgentUserRepository agentUserRes; private final AgentUserRepository agentUserRes;
@Autowired @NonNull
private ContactsRepository contactsRes; private final ContactsRepository contactsRes;
@Autowired
private OnlineUserRepository onlineUserRes;
@Value("${web.upload-path}")
private String path;
@Autowired
private SNSAccountRepository snsAccountRes;
@NonNull
private final OnlineUserRepository onlineUserRes;
@NonNull
private final SNSAccountRepository snsAccountRes;
/** /**
* 在传输SkypeId中有操作混入了非法字符 * 在传输SkypeId中有操作混入了非法字符
*
* @param dirty
* @return
*/ */
public String sanitizeSkypeId(final String dirty) { public String sanitizeSkypeId(final String dirty) {
if (dirty != null) { if (dirty != null) {
@ -80,7 +73,6 @@ public class ContactsProxy {
* *
* @param logined 当前查询该信息的访客 * @param logined 当前查询该信息的访客
* @param contactid 目标联系人ID * @param contactid 目标联系人ID
* @return
*/ */
public List<MainContext.ChannelType> liveApproachChannelsByContactid( public List<MainContext.ChannelType> liveApproachChannelsByContactid(
final User logined, final User logined,
@ -106,9 +98,7 @@ public class ContactsProxy {
if (!cache.existBlackEntityByUserIdAndOrgi(p.getUserid(), logined.getOrgi())) { if (!cache.existBlackEntityByUserIdAndOrgi(p.getUserid(), logined.getOrgi())) {
// 访客在线 WebIM排队或服务中 // 访客在线 WebIM排队或服务中
result.add(MainContext.ChannelType.WEBIM); result.add(MainContext.ChannelType.WEBIM);
} else { } // else 该访客被拉黑
// 该访客被拉黑
}
}); });
// 查看 Skype 渠道 // 查看 Skype 渠道
@ -162,10 +152,6 @@ public class ContactsProxy {
/** /**
* 批量查询联系人的可触达状态 * 批量查询联系人的可触达状态
*
* @param contacts
* @param map
* @param user
*/ */
public void bindContactsApproachableData(final Page<Contacts> contacts, final ModelMap map, final User user) { public void bindContactsApproachableData(final Page<Contacts> contacts, final ModelMap map, final User user) {
Set<String> approachable = new HashSet<>(); Set<String> approachable = new HashSet<>();
@ -184,23 +170,14 @@ public class ContactsProxy {
/** /**
* 检查Skype渠道是否被建立 * 检查Skype渠道是否被建立
*
* @return
*/ */
public boolean isSkypeSetup(final String orgi) { public boolean isSkypeSetup(final String orgi) {
if (MainContext.hasModule(Constants.CSKEFU_MODULE_SKYPE) && snsAccountRes.countBySnstypeAndOrgi( return MainContext.hasModule(Constants.CSKEFU_MODULE_SKYPE) && snsAccountRes.countBySnstypeAndOrgi(
Constants.CSKEFU_MODULE_SKYPE, orgi) > 0) { Constants.CSKEFU_MODULE_SKYPE, orgi) > 0;
return true;
}
return false;
} }
/** /**
* 判断编辑是否变更 * 判断编辑是否变更
*
* @param newValue
* @param oldValue
* @return
*/ */
public boolean determineChange(Contacts newValue, Contacts oldValue) { public boolean determineChange(Contacts newValue, Contacts oldValue) {
return (!newValue.getName().equals(oldValue.getName()) || return (!newValue.getName().equals(oldValue.getName()) ||