mirror of
https://github.com/chatopera/cosin.git
synced 2025-08-01 16:38:02 +08:00
Closed #111 支持WebIM的集群场景下使用
This commit is contained in:
parent
901e9aa621
commit
29ebd3125b
@ -214,8 +214,8 @@ public class AutomaticServiceDist {
|
|||||||
router.handler(agentUser.getUserid(), MainContext.MessageTypeEnum.MESSAGE.toString(), agentUser.getAppid(), outMessage);
|
router.handler(agentUser.getUserid(), MainContext.MessageTypeEnum.MESSAGE.toString(), agentUser.getAppid(), outMessage);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// TODO #111 为坐席分配访客
|
||||||
NettyClients.getInstance().sendAgentEventMessage(agentService.getAgentno(), MainContext.MessageTypeEnum.NEW.toString(), agentUser);
|
NettyClients.getInstance().publishAgentEventMessage(agentService.getAgentno(), MainContext.MessageTypeEnum.NEW.toString(), agentUser);
|
||||||
} catch (Exception ex) {
|
} catch (Exception ex) {
|
||||||
ex.printStackTrace();
|
ex.printStackTrace();
|
||||||
}
|
}
|
||||||
@ -311,7 +311,8 @@ public class AutomaticServiceDist {
|
|||||||
NettyClients.getInstance().sendCalloutEventMessage(agentUser.getAgentno(), MainContext.MessageTypeEnum.END.toString(), agentUser);
|
NettyClients.getInstance().sendCalloutEventMessage(agentUser.getAgentno(), MainContext.MessageTypeEnum.END.toString(), agentUser);
|
||||||
} else {
|
} else {
|
||||||
if (agentStatus != null) // WebIM 查看用户状态
|
if (agentStatus != null) // WebIM 查看用户状态
|
||||||
NettyClients.getInstance().sendAgentEventMessage(agentUser.getAgentno(), MainContext.MessageTypeEnum.END.toString(), agentUser);
|
// TODO #111 结束会话
|
||||||
|
NettyClients.getInstance().publishAgentEventMessage(agentUser.getAgentno(), MainContext.MessageTypeEnum.END.toString(), agentUser);
|
||||||
OutMessageRouter router = null;
|
OutMessageRouter router = null;
|
||||||
router = (OutMessageRouter) MainContext.getContext().getBean(agentUser.getChannel());
|
router = (OutMessageRouter) MainContext.getContext().getBean(agentUser.getChannel());
|
||||||
if (router != null) {
|
if (router != null) {
|
||||||
@ -500,7 +501,8 @@ public class AutomaticServiceDist {
|
|||||||
if (agentStatus != null) {
|
if (agentStatus != null) {
|
||||||
agentService = processAgentService(agentStatus, agentUser, orgi);
|
agentService = processAgentService(agentStatus, agentUser, orgi);
|
||||||
publishMessage(orgi, "invite", "success", agentno);
|
publishMessage(orgi, "invite", "success", agentno);
|
||||||
NettyClients.getInstance().sendAgentEventMessage(agentService.getAgentno(), MainContext.MessageTypeEnum.NEW.toString(), agentUser);
|
// TODO #111 为坐席分配邀请的访客
|
||||||
|
NettyClients.getInstance().publishAgentEventMessage(agentService.getAgentno(), MainContext.MessageTypeEnum.NEW.toString(), agentUser);
|
||||||
} else {
|
} else {
|
||||||
agentService = allotAgent(agentUser, orgi);
|
agentService = allotAgent(agentUser, orgi);
|
||||||
}
|
}
|
||||||
|
@ -15,8 +15,10 @@
|
|||||||
*/
|
*/
|
||||||
package com.chatopera.cc.app.config;
|
package com.chatopera.cc.app.config;
|
||||||
|
|
||||||
import com.chatopera.cc.util.Constants;
|
|
||||||
import com.chatopera.cc.app.schedule.CallOutWireTask;
|
import com.chatopera.cc.app.schedule.CallOutWireTask;
|
||||||
|
import com.chatopera.cc.app.schedule.WebIMAgentDispatcher;
|
||||||
|
import com.chatopera.cc.app.schedule.WebIMOnlineUserDispatcher;
|
||||||
|
import com.chatopera.cc.util.Constants;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.context.annotation.Bean;
|
import org.springframework.context.annotation.Bean;
|
||||||
import org.springframework.context.annotation.Configuration;
|
import org.springframework.context.annotation.Configuration;
|
||||||
@ -38,17 +40,25 @@ public class RedisConfigure {
|
|||||||
@Autowired
|
@Autowired
|
||||||
CallOutWireTask callOutWireTask;
|
CallOutWireTask callOutWireTask;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
WebIMAgentDispatcher webIMAgentDispatcher;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
WebIMOnlineUserDispatcher webIMOnlineUserDispatcher;
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
RedisMessageListenerContainer redisContainer() {
|
RedisMessageListenerContainer redisContainer() {
|
||||||
final RedisMessageListenerContainer container = new RedisMessageListenerContainer();
|
final RedisMessageListenerContainer container = new RedisMessageListenerContainer();
|
||||||
container.setConnectionFactory(jedisConnectionFactory);
|
container.setConnectionFactory(jedisConnectionFactory);
|
||||||
container.addMessageListener(messageListener(), pbxEvents());
|
container.addMessageListener(pbxMessageListener(), pbxEvents());
|
||||||
|
container.addMessageListener(imAgentDispatchListener(), imAgentEvents());
|
||||||
|
container.addMessageListener(imOnlineUserDispatchListener(), imOnlineUserEvents());
|
||||||
container.setTaskExecutor(Executors.newFixedThreadPool(50));
|
container.setTaskExecutor(Executors.newFixedThreadPool(50));
|
||||||
return container;
|
return container;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
MessageListenerAdapter messageListener() {
|
MessageListenerAdapter pbxMessageListener() {
|
||||||
return new MessageListenerAdapter(callOutWireTask);
|
return new MessageListenerAdapter(callOutWireTask);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -57,4 +67,25 @@ public class RedisConfigure {
|
|||||||
return new PatternTopic(Constants.FS_CHANNEL_FS_TO_CC);
|
return new PatternTopic(Constants.FS_CHANNEL_FS_TO_CC);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
MessageListenerAdapter imAgentDispatchListener() {
|
||||||
|
return new MessageListenerAdapter(webIMAgentDispatcher);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
PatternTopic imAgentEvents() {
|
||||||
|
return new PatternTopic(Constants.INSTANT_MESSAGING_WEBIM_AGENT_CHANNEL);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
MessageListenerAdapter imOnlineUserDispatchListener(){
|
||||||
|
return new MessageListenerAdapter(webIMOnlineUserDispatcher);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
PatternTopic imOnlineUserEvents() {
|
||||||
|
return new PatternTopic(Constants.INSTANT_MESSAGING_WEBIM_ONLINE_USER_CHANNEL);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -768,8 +768,8 @@ public class AgentController extends Handler {
|
|||||||
data.setUsername(super.getUser(request).getUsername());
|
data.setUsername(super.getUser(request).getUsername());
|
||||||
|
|
||||||
chatMessageRepository.save(data);
|
chatMessageRepository.save(data);
|
||||||
|
// TODO #111 通知文件上传消息
|
||||||
NettyClients.getInstance().sendAgentEventMessage(agentUser.getAgentno(), MainContext.MessageTypeEnum.MESSAGE.toString(), data);
|
NettyClients.getInstance().publishAgentEventMessage(agentUser.getAgentno(), MainContext.MessageTypeEnum.MESSAGE.toString(), data);
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
@ -1068,7 +1068,8 @@ public class AgentController extends Handler {
|
|||||||
agentService.setAgentno(agentno);
|
agentService.setAgentno(agentno);
|
||||||
agentService.setAgentusername(transAgentStatus.getUsername());
|
agentService.setAgentusername(transAgentStatus.getUsername());
|
||||||
}
|
}
|
||||||
NettyClients.getInstance().sendAgentEventMessage(agentno, MainContext.MessageTypeEnum.NEW.toString(), agentUser);
|
// TODO #111 通知转接消息
|
||||||
|
NettyClients.getInstance().publishAgentEventMessage(agentno, MainContext.MessageTypeEnum.NEW.toString(), agentUser);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
agentUser = agentUserRepository.findByIdAndOrgi(agentuserid, super.getOrgi(request));
|
agentUser = agentUserRepository.findByIdAndOrgi(agentuserid, super.getOrgi(request));
|
||||||
|
@ -16,27 +16,17 @@
|
|||||||
*/
|
*/
|
||||||
package com.chatopera.cc.app.handler.apps.service;
|
package com.chatopera.cc.app.handler.apps.service;
|
||||||
|
|
||||||
import java.text.ParseException;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Date;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import javax.persistence.criteria.CriteriaBuilder;
|
|
||||||
import javax.persistence.criteria.CriteriaQuery;
|
|
||||||
import javax.persistence.criteria.Predicate;
|
|
||||||
import javax.persistence.criteria.Root;
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
|
||||||
import javax.validation.Valid;
|
|
||||||
|
|
||||||
import com.chatopera.cc.app.basic.MainContext;
|
|
||||||
import com.chatopera.cc.util.IP;
|
|
||||||
import com.chatopera.cc.app.basic.MainUtils;
|
|
||||||
import com.chatopera.cc.util.Menu;
|
|
||||||
import com.chatopera.cc.app.im.client.NettyClients;
|
|
||||||
import com.chatopera.cc.app.algorithm.AutomaticServiceDist;
|
import com.chatopera.cc.app.algorithm.AutomaticServiceDist;
|
||||||
|
import com.chatopera.cc.app.basic.MainContext;
|
||||||
|
import com.chatopera.cc.app.basic.MainUtils;
|
||||||
import com.chatopera.cc.app.cache.CacheHelper;
|
import com.chatopera.cc.app.cache.CacheHelper;
|
||||||
import com.chatopera.cc.util.OnlineUserUtils;
|
|
||||||
import com.chatopera.cc.app.handler.Handler;
|
import com.chatopera.cc.app.handler.Handler;
|
||||||
|
import com.chatopera.cc.app.im.client.NettyClients;
|
||||||
|
import com.chatopera.cc.app.model.*;
|
||||||
|
import com.chatopera.cc.app.persistence.repository.*;
|
||||||
|
import com.chatopera.cc.util.IP;
|
||||||
|
import com.chatopera.cc.util.Menu;
|
||||||
|
import com.chatopera.cc.util.OnlineUserUtils;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.data.domain.Page;
|
import org.springframework.data.domain.Page;
|
||||||
@ -48,21 +38,16 @@ import org.springframework.ui.ModelMap;
|
|||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.servlet.ModelAndView;
|
import org.springframework.web.servlet.ModelAndView;
|
||||||
|
|
||||||
import com.chatopera.cc.app.persistence.repository.AgentServiceRepository;
|
import javax.persistence.criteria.CriteriaBuilder;
|
||||||
import com.chatopera.cc.app.persistence.repository.AgentStatusRepository;
|
import javax.persistence.criteria.CriteriaQuery;
|
||||||
import com.chatopera.cc.app.persistence.repository.AgentUserRepository;
|
import javax.persistence.criteria.Predicate;
|
||||||
import com.chatopera.cc.app.persistence.repository.LeaveMsgRepository;
|
import javax.persistence.criteria.Root;
|
||||||
import com.chatopera.cc.app.persistence.repository.OrganRepository;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
import com.chatopera.cc.app.persistence.repository.OrgiSkillRelRepository;
|
import javax.validation.Valid;
|
||||||
import com.chatopera.cc.app.persistence.repository.UserRepository;
|
import java.text.ParseException;
|
||||||
import com.chatopera.cc.app.model.AgentService;
|
import java.util.ArrayList;
|
||||||
import com.chatopera.cc.app.model.AgentStatus;
|
import java.util.Date;
|
||||||
import com.chatopera.cc.app.model.AgentUser;
|
import java.util.List;
|
||||||
import com.chatopera.cc.app.model.AiUser;
|
|
||||||
import com.chatopera.cc.app.model.LeaveMsg;
|
|
||||||
import com.chatopera.cc.app.model.Organ;
|
|
||||||
import com.chatopera.cc.app.model.OrgiSkillRel;
|
|
||||||
import com.chatopera.cc.app.model.User;
|
|
||||||
|
|
||||||
@Controller
|
@Controller
|
||||||
@RequestMapping("/service")
|
@RequestMapping("/service")
|
||||||
@ -212,7 +197,8 @@ public class ChatServiceController extends Handler {
|
|||||||
agentService.setAgentno(agentno);
|
agentService.setAgentno(agentno);
|
||||||
agentService.setAgentusername(transAgentStatus.getUsername());
|
agentService.setAgentusername(transAgentStatus.getUsername());
|
||||||
}
|
}
|
||||||
NettyClients.getInstance().sendAgentEventMessage(agentno, MainContext.MessageTypeEnum.NEW.toString(), agentUser);
|
// TODO #111 通知转接消息
|
||||||
|
NettyClients.getInstance().publishAgentEventMessage(agentno, MainContext.MessageTypeEnum.NEW.toString(), agentUser);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
agentUser = agentUserRepository.findByIdAndOrgi(agentService.getAgentuserid(), super.getOrgi(request));
|
agentUser = agentUserRepository.findByIdAndOrgi(agentService.getAgentuserid(), super.getOrgi(request));
|
||||||
@ -374,14 +360,17 @@ public class ChatServiceController extends Handler {
|
|||||||
if (agentStatus != null) {
|
if (agentStatus != null) {
|
||||||
agentStatusRepository.delete(agentStatus);
|
agentStatusRepository.delete(agentStatus);
|
||||||
}
|
}
|
||||||
CacheHelper.getAgentStatusCacheBean().delete(agentStatus.getAgentno(), super.getOrgi(request));;
|
CacheHelper.getAgentStatusCacheBean().delete(agentStatus.getAgentno(), super.getOrgi(request));
|
||||||
|
;
|
||||||
AutomaticServiceDist.publishMessage(super.getOrgi(request), "agent", "offline", super.getUser(request).getId());
|
AutomaticServiceDist.publishMessage(super.getOrgi(request), "agent", "offline", super.getUser(request).getId());
|
||||||
|
|
||||||
|
|
||||||
return request(super.createRequestPageTempletResponse("redirect:/service/agent/index.html"));
|
return request(super.createRequestPageTempletResponse("redirect:/service/agent/index.html"));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 非管理员坐席
|
* 非管理员坐席
|
||||||
|
*
|
||||||
* @param map
|
* @param map
|
||||||
* @param request
|
* @param request
|
||||||
* @return
|
* @return
|
||||||
@ -410,8 +399,10 @@ public class ChatServiceController extends Handler {
|
|||||||
map.put("userList", userList);
|
map.put("userList", userList);
|
||||||
return request(super.createAppsTempletResponse("/apps/service/user/index"));
|
return request(super.createAppsTempletResponse("/apps/service/user/index"));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 管理员坐席
|
* 管理员坐席
|
||||||
|
*
|
||||||
* @param map
|
* @param map
|
||||||
* @param request
|
* @param request
|
||||||
* @return
|
* @return
|
||||||
@ -428,6 +419,7 @@ public class ChatServiceController extends Handler {
|
|||||||
map.put("userList", userList);
|
map.put("userList", userList);
|
||||||
return request(super.createAppsTempletResponse("/apps/service/adminagent/index"));
|
return request(super.createAppsTempletResponse("/apps/service/adminagent/index"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@RequestMapping("/leavemsg/index")
|
@RequestMapping("/leavemsg/index")
|
||||||
@Menu(type = "service", subtype = "leavemsg", admin = true)
|
@Menu(type = "service", subtype = "leavemsg", admin = true)
|
||||||
public ModelAndView leavemsg(ModelMap map, HttpServletRequest request) {
|
public ModelAndView leavemsg(ModelMap map, HttpServletRequest request) {
|
||||||
|
@ -16,13 +16,20 @@
|
|||||||
*/
|
*/
|
||||||
package com.chatopera.cc.app.im.client;
|
package com.chatopera.cc.app.im.client;
|
||||||
|
|
||||||
import java.util.List;
|
import com.chatopera.cc.app.basic.MainContext;
|
||||||
|
|
||||||
import com.corundumstudio.socketio.SocketIOClient;
|
|
||||||
import com.chatopera.cc.app.basic.MainUtils;
|
import com.chatopera.cc.app.basic.MainUtils;
|
||||||
|
import com.chatopera.cc.app.im.util.IMServiceUtils;
|
||||||
|
import com.chatopera.cc.app.schedule.WebIMAgentDispatcher;
|
||||||
|
import com.chatopera.cc.app.schedule.WebIMOnlineUserDispatcher;
|
||||||
|
import com.corundumstudio.socketio.SocketIOClient;
|
||||||
|
import com.google.gson.JsonObject;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
|
||||||
public class NettyClients {
|
public class NettyClients {
|
||||||
|
|
||||||
@ -48,9 +55,13 @@ public class NettyClients {
|
|||||||
return this.callCenterClients;
|
return this.callCenterClients;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 访客连接
|
||||||
|
*/
|
||||||
public void setImClients(NettyIMClient imClients) {
|
public void setImClients(NettyIMClient imClients) {
|
||||||
this.imClients = imClients;
|
this.imClients = imClients;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void putIMEventClient(String id, SocketIOClient userClient) {
|
public void putIMEventClient(String id, SocketIOClient userClient) {
|
||||||
imClients.putClient(id, userClient);
|
imClients.putClient(id, userClient);
|
||||||
}
|
}
|
||||||
@ -63,47 +74,97 @@ public class NettyClients {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void removeIMEventClient(String id, String sessionid) {
|
public void removeIMEventClient(String id, String sessionid) {
|
||||||
imClients.removeClient(id, sessionid);
|
imClients.removeClient(id, sessionid);
|
||||||
}
|
}
|
||||||
public void sendIMEventMessage(String id , String event , Object data){
|
|
||||||
|
public void publishIMEventMessage(final String id, final String event, Serializable data) {
|
||||||
|
// 检测client是否在这台机器上
|
||||||
|
if (!sendIMEventMessage(id, event, data)) {
|
||||||
|
try {
|
||||||
|
JsonObject payload = new JsonObject();
|
||||||
|
payload.addProperty("event", event);
|
||||||
|
payload.addProperty("id", id);
|
||||||
|
payload.addProperty("data", IMServiceUtils.serialize(data));
|
||||||
|
MainContext.getContext().getBean(WebIMOnlineUserDispatcher.class).publish(payload);
|
||||||
|
} catch (IOException e) {
|
||||||
|
logger.error("publishIMEventMessage", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean sendIMEventMessage(final String id, final String event, Object data) {
|
||||||
List<SocketIOClient> userClients = imClients.getClients(id);
|
List<SocketIOClient> userClients = imClients.getClients(id);
|
||||||
for (SocketIOClient userClient : userClients) {
|
for (SocketIOClient userClient : userClients) {
|
||||||
userClient.sendEvent(event, data);
|
userClient.sendEvent(event, data);
|
||||||
}
|
}
|
||||||
|
return userClients.size() > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 坐席连接
|
||||||
|
*/
|
||||||
public void setAgentClients(NettyAgentClient agentClients) {
|
public void setAgentClients(NettyAgentClient agentClients) {
|
||||||
this.agentClients = agentClients;
|
this.agentClients = agentClients;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void putAgentEventClient(String id, SocketIOClient agentClient) {
|
public void putAgentEventClient(String id, SocketIOClient agentClient) {
|
||||||
agentClients.putClient(id, agentClient);
|
agentClients.putClient(id, agentClient);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void removeAgentEventClient(String id, String sessionid) {
|
public void removeAgentEventClient(String id, String sessionid) {
|
||||||
agentClients.removeClient(id, sessionid);
|
agentClients.removeClient(id, sessionid);
|
||||||
}
|
}
|
||||||
public void sendAgentEventMessage(String id , String event , Object data){
|
|
||||||
|
// publish to Redis
|
||||||
|
public void publishAgentEventMessage(String id, String event, Serializable data) {
|
||||||
|
// 检测client是否在这台机器上
|
||||||
|
if (!sendAgentEventMessage(id, event, data)) {
|
||||||
|
try {
|
||||||
|
JsonObject payload = new JsonObject();
|
||||||
|
payload.addProperty("event", event);
|
||||||
|
payload.addProperty("id", id);
|
||||||
|
payload.addProperty("data", IMServiceUtils.serialize(data));
|
||||||
|
MainContext.getContext().getBean(WebIMAgentDispatcher.class).publish(payload);
|
||||||
|
} catch (IOException e) {
|
||||||
|
logger.error("publishAgentEventMessage", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 向坐席发送消息
|
||||||
|
public boolean sendAgentEventMessage(String id, String event, Object data) {
|
||||||
List<SocketIOClient> agents = agentClients.getClients(id);
|
List<SocketIOClient> agents = agentClients.getClients(id);
|
||||||
for (SocketIOClient agentClient : agents) {
|
for (SocketIOClient agentClient : agents) {
|
||||||
agentClient.sendEvent(event, data);
|
agentClient.sendEvent(event, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return agents.size() > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 企业聊天
|
||||||
|
*/
|
||||||
public void setEntImClients(NettyIMClient entIMClients) {
|
public void setEntImClients(NettyIMClient entIMClients) {
|
||||||
this.entIMClients = entIMClients;
|
this.entIMClients = entIMClients;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void putEntIMEventClient(String id, SocketIOClient userClient) {
|
public void putEntIMEventClient(String id, SocketIOClient userClient) {
|
||||||
entIMClients.putClient(id, userClient);
|
entIMClients.putClient(id, userClient);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void removeEntIMEventClient(String id, String sessionid) {
|
public void removeEntIMEventClient(String id, String sessionid) {
|
||||||
entIMClients.removeClient(id, sessionid);
|
entIMClients.removeClient(id, sessionid);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void sendEntIMEventMessage(String id, String event, Object data) {
|
public void sendEntIMEventMessage(String id, String event, Object data) {
|
||||||
List<SocketIOClient> entims = entIMClients.getClients(id);
|
List<SocketIOClient> entims = entIMClients.getClients(id);
|
||||||
for (SocketIOClient userClient : entims) {
|
for (SocketIOClient userClient : entims) {
|
||||||
userClient.sendEvent(event, data);
|
userClient.sendEvent(event, data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getEntIMClientsNum(String user) {
|
public int getEntIMClientsNum(String user) {
|
||||||
return entIMClients.getClients(user) != null ? entIMClients.getClients(user).size() : 0;
|
return entIMClients.getClients(user) != null ? entIMClients.getClients(user).size() : 0;
|
||||||
}
|
}
|
||||||
@ -115,6 +176,25 @@ public class NettyClients {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Callout Event Server Methods.
|
||||||
|
*/
|
||||||
|
public void putCalloutEventClient(String id, SocketIOClient client) {
|
||||||
|
calloutClients.putClient(id, client);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void removeCalloutEventClient(String id, String sessionId) {
|
||||||
|
calloutClients.removeClient(id, sessionId);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void sendCalloutEventMessage(String id, String event, Object data) {
|
||||||
|
List<SocketIOClient> _clients = calloutClients.getClients(id);
|
||||||
|
logger.info("sendCalloutEventMessage get clients size {}", _clients.size());
|
||||||
|
for (SocketIOClient c : _clients) {
|
||||||
|
c.sendEvent(event, data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Chatbot Event Server Methods.
|
* Chatbot Event Server Methods.
|
||||||
@ -135,23 +215,4 @@ public class NettyClients {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Callout Event Server Methods.
|
|
||||||
*/
|
|
||||||
public void putCalloutEventClient(String id, SocketIOClient client){
|
|
||||||
calloutClients.putClient(id, client);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void removeCalloutEventClient(String id, String sessionId) {
|
|
||||||
calloutClients.removeClient(id, sessionId);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void sendCalloutEventMessage(String id, String event, Object data){
|
|
||||||
List<SocketIOClient> _clients = calloutClients.getClients(id);
|
|
||||||
logger.info("sendCalloutEventMessage get clients size {}", _clients.size());
|
|
||||||
for(SocketIOClient c: _clients){
|
|
||||||
c.sendEvent(event, data);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -16,57 +16,45 @@
|
|||||||
*/
|
*/
|
||||||
package com.chatopera.cc.app.im.handler;
|
package com.chatopera.cc.app.im.handler;
|
||||||
|
|
||||||
import java.net.InetSocketAddress;
|
|
||||||
import java.util.Date;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import com.chatopera.cc.app.algorithm.AutomaticServiceDist;
|
import com.chatopera.cc.app.algorithm.AutomaticServiceDist;
|
||||||
import com.chatopera.cc.app.basic.MainContext;
|
import com.chatopera.cc.app.basic.MainContext;
|
||||||
import com.chatopera.cc.app.basic.MainUtils;
|
import com.chatopera.cc.app.basic.MainUtils;
|
||||||
import com.chatopera.cc.app.im.client.NettyClients;
|
|
||||||
import com.chatopera.cc.app.cache.CacheHelper;
|
import com.chatopera.cc.app.cache.CacheHelper;
|
||||||
import com.chatopera.cc.app.im.router.OutMessageRouter;
|
import com.chatopera.cc.app.im.client.NettyClients;
|
||||||
import com.chatopera.cc.app.im.message.AgentServiceMessage;
|
import com.chatopera.cc.app.im.message.AgentServiceMessage;
|
||||||
import com.chatopera.cc.app.im.message.AgentStatusMessage;
|
import com.chatopera.cc.app.im.message.AgentStatusMessage;
|
||||||
import com.chatopera.cc.app.im.message.ChatMessage;
|
import com.chatopera.cc.app.im.message.ChatMessage;
|
||||||
import org.apache.commons.lang.StringUtils;
|
import com.chatopera.cc.app.im.router.OutMessageRouter;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import com.chatopera.cc.app.model.*;
|
||||||
|
import com.chatopera.cc.app.persistence.repository.*;
|
||||||
import com.corundumstudio.socketio.AckRequest;
|
import com.corundumstudio.socketio.AckRequest;
|
||||||
import com.corundumstudio.socketio.SocketIOClient;
|
import com.corundumstudio.socketio.SocketIOClient;
|
||||||
import com.corundumstudio.socketio.SocketIOServer;
|
import com.corundumstudio.socketio.SocketIOServer;
|
||||||
import com.corundumstudio.socketio.annotation.OnConnect;
|
import com.corundumstudio.socketio.annotation.OnConnect;
|
||||||
import com.corundumstudio.socketio.annotation.OnDisconnect;
|
import com.corundumstudio.socketio.annotation.OnDisconnect;
|
||||||
import com.corundumstudio.socketio.annotation.OnEvent;
|
import com.corundumstudio.socketio.annotation.OnEvent;
|
||||||
import com.chatopera.cc.app.persistence.repository.AgentStatusRepository;
|
import org.apache.commons.lang.StringUtils;
|
||||||
import com.chatopera.cc.app.persistence.repository.AgentUserRepository;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import com.chatopera.cc.app.persistence.repository.AgentUserTaskRepository;
|
|
||||||
import com.chatopera.cc.app.persistence.repository.ChatMessageRepository;
|
|
||||||
import com.chatopera.cc.app.persistence.repository.WorkSessionRepository;
|
|
||||||
import com.chatopera.cc.app.model.AgentStatus;
|
|
||||||
import com.chatopera.cc.app.model.AgentUser;
|
|
||||||
import com.chatopera.cc.app.model.AgentUserTask;
|
|
||||||
import com.chatopera.cc.app.model.MessageOutContent;
|
|
||||||
import com.chatopera.cc.app.model.WorkSession;
|
|
||||||
|
|
||||||
public class AgentEventHandler
|
import java.net.InetSocketAddress;
|
||||||
{
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class AgentEventHandler {
|
||||||
protected SocketIOServer server;
|
protected SocketIOServer server;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
public AgentEventHandler(SocketIOServer server)
|
public AgentEventHandler(SocketIOServer server) {
|
||||||
{
|
|
||||||
this.server = server;
|
this.server = server;
|
||||||
}
|
}
|
||||||
|
|
||||||
@OnConnect
|
@OnConnect
|
||||||
public void onConnect(SocketIOClient client)
|
public void onConnect(SocketIOClient client) {
|
||||||
{
|
|
||||||
String user = client.getHandshakeData().getSingleUrlParam("userid");
|
String user = client.getHandshakeData().getSingleUrlParam("userid");
|
||||||
String orgi = client.getHandshakeData().getSingleUrlParam("orgi");
|
String orgi = client.getHandshakeData().getSingleUrlParam("orgi");
|
||||||
String session = client.getHandshakeData().getSingleUrlParam("session");
|
String session = client.getHandshakeData().getSingleUrlParam("session");
|
||||||
String admin = client.getHandshakeData().getSingleUrlParam("admin");
|
String admin = client.getHandshakeData().getSingleUrlParam("admin");
|
||||||
if(!StringUtils.isBlank(user) && !StringUtils.isBlank(user)){
|
if (StringUtils.isNotBlank(user) && StringUtils.isNotBlank(user)) {
|
||||||
client.set("agentno", user);
|
client.set("agentno", user);
|
||||||
AgentStatusRepository agentStatusRepository = MainContext.getContext().getBean(AgentStatusRepository.class);
|
AgentStatusRepository agentStatusRepository = MainContext.getContext().getBean(AgentStatusRepository.class);
|
||||||
List<AgentStatus> agentStatusList = agentStatusRepository.findByAgentnoAndOrgi(user, orgi);
|
List<AgentStatus> agentStatusList = agentStatusRepository.findByAgentnoAndOrgi(user, orgi);
|
||||||
@ -93,13 +81,12 @@ public class AgentEventHandler
|
|||||||
|
|
||||||
//添加@OnDisconnect事件,客户端断开连接时调用,刷新客户端信息
|
//添加@OnDisconnect事件,客户端断开连接时调用,刷新客户端信息
|
||||||
@OnDisconnect
|
@OnDisconnect
|
||||||
public void onDisconnect(SocketIOClient client)
|
public void onDisconnect(SocketIOClient client) {
|
||||||
{
|
|
||||||
String user = client.getHandshakeData().getSingleUrlParam("userid");
|
String user = client.getHandshakeData().getSingleUrlParam("userid");
|
||||||
String orgi = client.getHandshakeData().getSingleUrlParam("orgi");
|
String orgi = client.getHandshakeData().getSingleUrlParam("orgi");
|
||||||
String admin = client.getHandshakeData().getSingleUrlParam("admin");
|
String admin = client.getHandshakeData().getSingleUrlParam("admin");
|
||||||
if(!StringUtils.isBlank(user)){
|
if (StringUtils.isNotBlank(user)) {
|
||||||
AutomaticServiceDist.deleteAgentStatus(user, orgi, !StringUtils.isBlank(admin) && admin.equals("true"));
|
AutomaticServiceDist.deleteAgentStatus(user, orgi, StringUtils.isNotBlank(admin) && admin.equals("true"));
|
||||||
NettyClients.getInstance().removeAgentEventClient(user, MainUtils.getContextID(client.getSessionId().toString()));
|
NettyClients.getInstance().removeAgentEventClient(user, MainUtils.getContextID(client.getSessionId().toString()));
|
||||||
|
|
||||||
WorkSessionRepository workSessionRepository = MainContext.getContext().getBean(WorkSessionRepository.class);
|
WorkSessionRepository workSessionRepository = MainContext.getContext().getBean(WorkSessionRepository.class);
|
||||||
@ -122,22 +109,19 @@ public class AgentEventHandler
|
|||||||
|
|
||||||
//消息接收入口,当接收到消息后,查找发送目标客户端,并且向该客户端发送消息,且给自己发送消息
|
//消息接收入口,当接收到消息后,查找发送目标客户端,并且向该客户端发送消息,且给自己发送消息
|
||||||
@OnEvent(value = "service")
|
@OnEvent(value = "service")
|
||||||
public void onEvent(SocketIOClient client, AckRequest request, AgentServiceMessage data)
|
public void onEvent(SocketIOClient client, AckRequest request, AgentServiceMessage data) {
|
||||||
{
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//消息接收入口,当接收到消息后,查找发送目标客户端,并且向该客户端发送消息,且给自己发送消息
|
//消息接收入口,当接收到消息后,查找发送目标客户端,并且向该客户端发送消息,且给自己发送消息
|
||||||
@OnEvent(value = "status")
|
@OnEvent(value = "status")
|
||||||
public void onEvent(SocketIOClient client, AckRequest request, AgentStatusMessage data)
|
public void onEvent(SocketIOClient client, AckRequest request, AgentStatusMessage data) {
|
||||||
{
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//消息接收入口,当接收到消息后,查找发送目标客户端,并且向该客户端发送消息,且给自己发送消息
|
//消息接收入口,当接收到消息后,查找发送目标客户端,并且向该客户端发送消息,且给自己发送消息
|
||||||
@OnEvent(value = "message")
|
@OnEvent(value = "message")
|
||||||
public void onEvent(SocketIOClient client, AckRequest request, ChatMessage data)
|
public void onEvent(SocketIOClient client, AckRequest request, ChatMessage data) {
|
||||||
{
|
|
||||||
String user = client.getHandshakeData().getSingleUrlParam("userid");
|
String user = client.getHandshakeData().getSingleUrlParam("userid");
|
||||||
AgentUser agentUser = (AgentUser) CacheHelper.getAgentUserCacheBean().getCacheObject(data.getTouser(), data.getOrgi());
|
AgentUser agentUser = (AgentUser) CacheHelper.getAgentUserCacheBean().getCacheObject(data.getTouser(), data.getOrgi());
|
||||||
MessageOutContent outMessage = new MessageOutContent();
|
MessageOutContent outMessage = new MessageOutContent();
|
||||||
@ -178,7 +162,7 @@ public class AgentEventHandler
|
|||||||
}
|
}
|
||||||
|
|
||||||
data.setCalltype(MainContext.CallTypeEnum.OUT.toString());
|
data.setCalltype(MainContext.CallTypeEnum.OUT.toString());
|
||||||
if(!StringUtils.isBlank(agentUser.getAgentno())){
|
if (StringUtils.isNotBlank(agentUser.getAgentno())) {
|
||||||
data.setTouser(agentUser.getUserid());
|
data.setTouser(agentUser.getUserid());
|
||||||
}
|
}
|
||||||
data.setChannel(agentUser.getChannel());
|
data.setChannel(agentUser.getChannel());
|
||||||
@ -229,7 +213,7 @@ public class AgentEventHandler
|
|||||||
|
|
||||||
client.sendEvent(MainContext.MessageTypeEnum.MESSAGE.toString(), data);
|
client.sendEvent(MainContext.MessageTypeEnum.MESSAGE.toString(), data);
|
||||||
|
|
||||||
if(!StringUtils.isBlank(data.getTouser())){
|
if (StringUtils.isNotBlank(data.getTouser())) {
|
||||||
OutMessageRouter router = null;
|
OutMessageRouter router = null;
|
||||||
router = (OutMessageRouter) MainContext.getContext().getBean(agentUser.getChannel());
|
router = (OutMessageRouter) MainContext.getContext().getBean(agentUser.getChannel());
|
||||||
if (router != null) {
|
if (router != null) {
|
||||||
|
@ -51,7 +51,7 @@ public class CalloutEventHandler
|
|||||||
String admin = client.getHandshakeData().getSingleUrlParam("admin") ;
|
String admin = client.getHandshakeData().getSingleUrlParam("admin") ;
|
||||||
logger.info("onConnect userid {}, orgi {}.", user, orgi);
|
logger.info("onConnect userid {}, orgi {}.", user, orgi);
|
||||||
|
|
||||||
if(!StringUtils.isBlank(user) && !StringUtils.isBlank(user)){
|
if(StringUtils.isNotBlank(user) && StringUtils.isNotBlank(user)){
|
||||||
client.set("agentno", user);
|
client.set("agentno", user);
|
||||||
InetSocketAddress address = (InetSocketAddress) client.getRemoteAddress() ;
|
InetSocketAddress address = (InetSocketAddress) client.getRemoteAddress() ;
|
||||||
String ip = MainUtils.getIpAddr(client.getHandshakeData().getHttpHeaders(), address.getHostString()) ;
|
String ip = MainUtils.getIpAddr(client.getHandshakeData().getHttpHeaders(), address.getHostString()) ;
|
||||||
|
@ -58,7 +58,7 @@ public class MessageRouter extends Router {
|
|||||||
if (agentService != null && MainContext.AgentUserStatusEnum.INSERVICE.toString().equals(agentService.getStatus())) {
|
if (agentService != null && MainContext.AgentUserStatusEnum.INSERVICE.toString().equals(agentService.getStatus())) {
|
||||||
outMessage.setMessage(AutomaticServiceDist.getSuccessMessage(agentService, inMessage.getAgentUser().getChannel(), inMessage.getOrgi()));
|
outMessage.setMessage(AutomaticServiceDist.getSuccessMessage(agentService, inMessage.getAgentUser().getChannel(), inMessage.getOrgi()));
|
||||||
// TODO #111 publish to redis
|
// TODO #111 publish to redis
|
||||||
NettyClients.getInstance().sendAgentEventMessage(agentService.getAgentno(), MainContext.MessageTypeEnum.NEW.toString(), inMessage.getAgentUser());
|
NettyClients.getInstance().publishAgentEventMessage(agentService.getAgentno(), MainContext.MessageTypeEnum.NEW.toString(), inMessage.getAgentUser());
|
||||||
} else {
|
} else {
|
||||||
if (agentService.getQueneindex() > 0) { //当前有坐席
|
if (agentService.getQueneindex() > 0) { //当前有坐席
|
||||||
outMessage.setMessage(AutomaticServiceDist.getQueneMessage(agentService.getQueneindex(), inMessage.getAgentUser().getChannel(), inMessage.getOrgi()));
|
outMessage.setMessage(AutomaticServiceDist.getQueneMessage(agentService.getQueneindex(), inMessage.getAgentUser().getChannel(), inMessage.getOrgi()));
|
||||||
|
@ -32,7 +32,7 @@ public class WebIMOutMessageRouter implements OutMessageRouter{
|
|||||||
@Override
|
@Override
|
||||||
public void handler(String touser, String msgtype, String appid,
|
public void handler(String touser, String msgtype, String appid,
|
||||||
MessageOutContent outMessage) {
|
MessageOutContent outMessage) {
|
||||||
NettyClients.getInstance().sendIMEventMessage(touser, msgtype, outMessage);
|
NettyClients.getInstance().publishIMEventMessage(touser, msgtype, outMessage);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -137,14 +137,14 @@ public class HumanUtils {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (StringUtils.isNotBlank(data.getUserid()) && MainContext.MessageTypeEnum.MESSAGE.toString().equals(data.getType())) {
|
if (StringUtils.isNotBlank(data.getUserid()) && MainContext.MessageTypeEnum.MESSAGE.toString().equals(data.getType())) {
|
||||||
NettyClients.getInstance().sendIMEventMessage(data.getUserid(), MainContext.MessageTypeEnum.MESSAGE.toString(), outMessage);
|
NettyClients.getInstance().publishIMEventMessage(data.getUserid(), MainContext.MessageTypeEnum.MESSAGE.toString(), outMessage);
|
||||||
if (statusMessage != null) {
|
if (statusMessage != null) {
|
||||||
NettyClients.getInstance().sendIMEventMessage(data.getUserid(), MainContext.MessageTypeEnum.STATUS.toString(), statusMessage);
|
NettyClients.getInstance().publishIMEventMessage(data.getUserid(), MainContext.MessageTypeEnum.STATUS.toString(), statusMessage);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (agentUser != null && StringUtils.isNotBlank(agentUser.getAgentno())) {
|
if (agentUser != null && StringUtils.isNotBlank(agentUser.getAgentno())) {
|
||||||
//将消息发送给 坐席
|
// TODO 将消息发送给 坐席
|
||||||
NettyClients.getInstance().sendAgentEventMessage(agentUser.getAgentno(), MainContext.MessageTypeEnum.MESSAGE.toString(), data);
|
NettyClients.getInstance().publishAgentEventMessage(agentUser.getAgentno(), MainContext.MessageTypeEnum.MESSAGE.toString(), data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -176,7 +176,7 @@ public class HumanUtils {
|
|||||||
// outMessage.setCreatetime(data.getCreatetime());
|
// outMessage.setCreatetime(data.getCreatetime());
|
||||||
//
|
//
|
||||||
// if (!StringUtils.isBlank(data.getUserid()) && MainContext.MessageTypeEnum.MESSAGE.toString().equals(data.getType())) {
|
// if (!StringUtils.isBlank(data.getUserid()) && MainContext.MessageTypeEnum.MESSAGE.toString().equals(data.getType())) {
|
||||||
// NettyClients.getInstance().sendIMEventMessage(data.getUserid(), MainContext.MessageTypeEnum.MESSAGE.toString(), outMessage);
|
// NettyClients.getInstance().publishIMEventMessage(data.getUserid(), MainContext.MessageTypeEnum.MESSAGE.toString(), outMessage);
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
|
|
||||||
|
@ -8,6 +8,9 @@ import org.apache.commons.lang.StringUtils;
|
|||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import java.io.*;
|
||||||
|
import java.util.Base64;
|
||||||
|
|
||||||
public class IMServiceUtils {
|
public class IMServiceUtils {
|
||||||
private final static Logger logger = LoggerFactory.getLogger(IMServiceUtils.class);
|
private final static Logger logger = LoggerFactory.getLogger(IMServiceUtils.class);
|
||||||
|
|
||||||
@ -36,4 +39,30 @@ public class IMServiceUtils {
|
|||||||
service.save(agentUser);
|
service.save(agentUser);
|
||||||
CacheHelper.getAgentUserCacheBean().put(agentUser.getUserid(), agentUser, orgi);
|
CacheHelper.getAgentUserCacheBean().put(agentUser.getUserid(), agentUser, orgi);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Write the object to a Base64 string.
|
||||||
|
*/
|
||||||
|
public static String serialize(Serializable o) throws IOException {
|
||||||
|
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||||
|
ObjectOutputStream oos = new ObjectOutputStream(baos);
|
||||||
|
oos.writeObject(o);
|
||||||
|
oos.close();
|
||||||
|
return Base64.getEncoder().encodeToString(baos.toByteArray());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read the object from Base64 string.
|
||||||
|
*/
|
||||||
|
public static Object deserialize(String s) throws IOException,
|
||||||
|
ClassNotFoundException {
|
||||||
|
byte[] data = Base64.getDecoder().decode(s);
|
||||||
|
ObjectInputStream ois = new ObjectInputStream(
|
||||||
|
new ByteArrayInputStream(data));
|
||||||
|
Object o = ois.readObject();
|
||||||
|
ois.close();
|
||||||
|
return o;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -20,7 +20,7 @@ package com.chatopera.cc.app.model;
|
|||||||
import com.chatopera.cc.app.basic.MainContext;
|
import com.chatopera.cc.app.basic.MainContext;
|
||||||
|
|
||||||
|
|
||||||
public class MessageInContent implements MessageDataBean{
|
public class MessageInContent implements MessageDataBean, java.io.Serializable {
|
||||||
|
|
||||||
public String id;
|
public String id;
|
||||||
private String nickName;
|
private String nickName;
|
||||||
@ -48,114 +48,151 @@ public class MessageInContent implements MessageDataBean{
|
|||||||
public String getId() {
|
public String getId() {
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setId(String id) {
|
public void setId(String id) {
|
||||||
this.id = id;
|
this.id = id;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getNickName() {
|
public String getNickName() {
|
||||||
return nickName;
|
return nickName;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setNickName(String nickName) {
|
public void setNickName(String nickName) {
|
||||||
this.nickName = nickName;
|
this.nickName = nickName;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getOrgi() {
|
public String getOrgi() {
|
||||||
return orgi;
|
return orgi;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setOrgi(String orgi) {
|
public void setOrgi(String orgi) {
|
||||||
this.orgi = orgi;
|
this.orgi = orgi;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getMessage() {
|
public String getMessage() {
|
||||||
return message;
|
return message;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setMessage(String message) {
|
public void setMessage(String message) {
|
||||||
this.message = message;
|
this.message = message;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getMessageType() {
|
public String getMessageType() {
|
||||||
return messageType;
|
return messageType;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setMessageType(String messageType) {
|
public void setMessageType(String messageType) {
|
||||||
this.messageType = messageType;
|
this.messageType = messageType;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getFromUser() {
|
public String getFromUser() {
|
||||||
return fromUser;
|
return fromUser;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setFromUser(String fromUser) {
|
public void setFromUser(String fromUser) {
|
||||||
this.fromUser = fromUser;
|
this.fromUser = fromUser;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getToUser() {
|
public String getToUser() {
|
||||||
return toUser;
|
return toUser;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setToUser(String toUser) {
|
public void setToUser(String toUser) {
|
||||||
this.toUser = toUser;
|
this.toUser = toUser;
|
||||||
}
|
}
|
||||||
|
|
||||||
public SNSAccount getSnsAccount() {
|
public SNSAccount getSnsAccount() {
|
||||||
return snsAccount;
|
return snsAccount;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setSnsAccount(SNSAccount snsAccount) {
|
public void setSnsAccount(SNSAccount snsAccount) {
|
||||||
this.snsAccount = snsAccount;
|
this.snsAccount = snsAccount;
|
||||||
}
|
}
|
||||||
|
|
||||||
public AgentUser getAgentUser() {
|
public AgentUser getAgentUser() {
|
||||||
return agentUser;
|
return agentUser;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setAgentUser(AgentUser agentUser) {
|
public void setAgentUser(AgentUser agentUser) {
|
||||||
this.agentUser = agentUser;
|
this.agentUser = agentUser;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Object getChannelMessage() {
|
public Object getChannelMessage() {
|
||||||
return channelMessage;
|
return channelMessage;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setChannelMessage(Object channelMessage) {
|
public void setChannelMessage(Object channelMessage) {
|
||||||
this.channelMessage = channelMessage;
|
this.channelMessage = channelMessage;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Object getUser() {
|
public Object getUser() {
|
||||||
return user;
|
return user;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setUser(Object user) {
|
public void setUser(Object user) {
|
||||||
this.user = user;
|
this.user = user;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getContextid() {
|
public String getContextid() {
|
||||||
return contextid;
|
return contextid;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setContextid(String contextid) {
|
public void setContextid(String contextid) {
|
||||||
this.contextid = contextid;
|
this.contextid = contextid;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getCalltype() {
|
public String getCalltype() {
|
||||||
return calltype;
|
return calltype;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setCalltype(String calltype) {
|
public void setCalltype(String calltype) {
|
||||||
this.calltype = calltype;
|
this.calltype = calltype;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getCreatetime() {
|
public String getCreatetime() {
|
||||||
return createtime;
|
return createtime;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setCreatetime(String createtime) {
|
public void setCreatetime(String createtime) {
|
||||||
this.createtime = createtime;
|
this.createtime = createtime;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getFilename() {
|
public String getFilename() {
|
||||||
return filename;
|
return filename;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setFilename(String filename) {
|
public void setFilename(String filename) {
|
||||||
this.filename = filename;
|
this.filename = filename;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getFilesize() {
|
public int getFilesize() {
|
||||||
return filesize;
|
return filesize;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setFilesize(int filesize) {
|
public void setFilesize(int filesize) {
|
||||||
this.filesize = filesize;
|
this.filesize = filesize;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getAgentserviceid() {
|
public String getAgentserviceid() {
|
||||||
return agentserviceid;
|
return agentserviceid;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setAgentserviceid(String agentserviceid) {
|
public void setAgentserviceid(String agentserviceid) {
|
||||||
this.agentserviceid = agentserviceid;
|
this.agentserviceid = agentserviceid;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getAttachmentid() {
|
public String getAttachmentid() {
|
||||||
return attachmentid;
|
return attachmentid;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setAttachmentid(String attachmentid) {
|
public void setAttachmentid(String attachmentid) {
|
||||||
this.attachmentid = attachmentid;
|
this.attachmentid = attachmentid;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isNoagent() {
|
public boolean isNoagent() {
|
||||||
return noagent;
|
return noagent;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setNoagent(boolean noagent) {
|
public void setNoagent(boolean noagent) {
|
||||||
this.noagent = noagent;
|
this.noagent = noagent;
|
||||||
}
|
}
|
||||||
|
@ -55,8 +55,6 @@ import java.util.List;
|
|||||||
@Component
|
@Component
|
||||||
public class CallOutWireTask implements MessageListener {
|
public class CallOutWireTask implements MessageListener {
|
||||||
private static final Logger logger = LoggerFactory.getLogger(CallOutWireTask.class);
|
private static final Logger logger = LoggerFactory.getLogger(CallOutWireTask.class);
|
||||||
private static final RedisSerializer<String> redisStringSerializer = new StringRedisSerializer();
|
|
||||||
|
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private CallOutDialplanRepository callOutDialplanRes;
|
private CallOutDialplanRepository callOutDialplanRes;
|
||||||
|
@ -0,0 +1,104 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2018 Chatopera Inc, <https://www.chatopera.com>
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.chatopera.cc.app.schedule;
|
||||||
|
|
||||||
|
import com.chatopera.cc.app.im.client.NettyClients;
|
||||||
|
import com.chatopera.cc.app.im.util.IMServiceUtils;
|
||||||
|
import com.chatopera.cc.util.Constants;
|
||||||
|
import com.google.gson.JsonObject;
|
||||||
|
import com.google.gson.JsonParser;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
|
import org.springframework.data.redis.connection.Message;
|
||||||
|
import org.springframework.data.redis.connection.MessageListener;
|
||||||
|
import org.springframework.data.redis.core.HashOperations;
|
||||||
|
import org.springframework.data.redis.core.ListOperations;
|
||||||
|
import org.springframework.data.redis.core.StringRedisTemplate;
|
||||||
|
import org.springframework.data.redis.listener.ChannelTopic;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import javax.annotation.PostConstruct;
|
||||||
|
import java.io.*;
|
||||||
|
import java.util.Base64;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 坐席消息分发
|
||||||
|
*/
|
||||||
|
@Component
|
||||||
|
public class WebIMAgentDispatcher implements MessageListener {
|
||||||
|
private final static Logger logger = LoggerFactory.getLogger(WebIMAgentDispatcher.class);
|
||||||
|
|
||||||
|
private ListOperations<String, String> redisListOps;
|
||||||
|
private HashOperations<String, String, String> redisHashOps;
|
||||||
|
|
||||||
|
@Value("${spring.redis.host}")
|
||||||
|
private String redisHost;
|
||||||
|
|
||||||
|
@Value("${spring.redis.port}")
|
||||||
|
private String redisPort;
|
||||||
|
|
||||||
|
@Value("${spring.redis.database}")
|
||||||
|
private String redisDB;
|
||||||
|
|
||||||
|
@Value("${application.node.id}")
|
||||||
|
private String appNodeId;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 使用StringRedisTemplate而不是RedisTemplate解决序列化问题
|
||||||
|
* https://stackoverflow.com/questions/13215024/weird-redis-key-with-spring-data-jedis
|
||||||
|
*/
|
||||||
|
@Autowired
|
||||||
|
private StringRedisTemplate redis;
|
||||||
|
|
||||||
|
@PostConstruct
|
||||||
|
private void init() {
|
||||||
|
redisListOps = redis.opsForList();
|
||||||
|
redisHashOps = redis.opsForHash();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Publish Message into Channel with redis PubSub
|
||||||
|
*
|
||||||
|
* @param j
|
||||||
|
*/
|
||||||
|
public void publish(JsonObject j) {
|
||||||
|
ChannelTopic ct = new ChannelTopic(String.format(Constants.INSTANT_MESSTRING_WEBIM_AGENT_PATTERN, appNodeId));
|
||||||
|
j.addProperty("node", appNodeId);
|
||||||
|
redis.convertAndSend(ct.getTopic(), j.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onMessage(Message message, byte[] bytes) {
|
||||||
|
logger.debug("[instant messaging] onMessage {}", message);
|
||||||
|
String payload = new String(message.getBody());
|
||||||
|
JsonParser parser = new JsonParser();
|
||||||
|
JsonObject j = parser.parse(payload).getAsJsonObject();
|
||||||
|
logger.debug("[instant messaging] message body {}", j.toString());
|
||||||
|
try {
|
||||||
|
NettyClients.getInstance().sendAgentEventMessage(j.get("id").getAsString(),
|
||||||
|
j.get("event").getAsString(),
|
||||||
|
IMServiceUtils.deserialize(j.get("data").getAsString()));
|
||||||
|
} catch (Exception e) {
|
||||||
|
logger.error("onMessage", e);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,102 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2018 Chatopera Inc, <https://www.chatopera.com>
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.chatopera.cc.app.schedule;
|
||||||
|
|
||||||
|
import com.chatopera.cc.app.im.client.NettyClients;
|
||||||
|
import com.chatopera.cc.app.im.util.IMServiceUtils;
|
||||||
|
import com.chatopera.cc.util.Constants;
|
||||||
|
import com.google.gson.JsonObject;
|
||||||
|
import com.google.gson.JsonParser;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
|
import org.springframework.data.redis.connection.Message;
|
||||||
|
import org.springframework.data.redis.connection.MessageListener;
|
||||||
|
import org.springframework.data.redis.core.HashOperations;
|
||||||
|
import org.springframework.data.redis.core.ListOperations;
|
||||||
|
import org.springframework.data.redis.core.StringRedisTemplate;
|
||||||
|
import org.springframework.data.redis.listener.ChannelTopic;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import javax.annotation.PostConstruct;
|
||||||
|
import java.io.*;
|
||||||
|
import java.util.Base64;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 访客消息分发
|
||||||
|
*/
|
||||||
|
@Component
|
||||||
|
public class WebIMOnlineUserDispatcher implements MessageListener {
|
||||||
|
private final static Logger logger = LoggerFactory.getLogger(WebIMOnlineUserDispatcher.class);
|
||||||
|
|
||||||
|
private ListOperations<String, String> redisListOps;
|
||||||
|
private HashOperations<String, String, String> redisHashOps;
|
||||||
|
|
||||||
|
@Value("${spring.redis.host}")
|
||||||
|
private String redisHost;
|
||||||
|
|
||||||
|
@Value("${spring.redis.port}")
|
||||||
|
private String redisPort;
|
||||||
|
|
||||||
|
@Value("${spring.redis.database}")
|
||||||
|
private String redisDB;
|
||||||
|
|
||||||
|
@Value("${application.node.id}")
|
||||||
|
private String appNodeId;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 使用StringRedisTemplate而不是RedisTemplate解决序列化问题
|
||||||
|
* https://stackoverflow.com/questions/13215024/weird-redis-key-with-spring-data-jedis
|
||||||
|
*/
|
||||||
|
@Autowired
|
||||||
|
private StringRedisTemplate redis;
|
||||||
|
|
||||||
|
@PostConstruct
|
||||||
|
private void init() {
|
||||||
|
redisListOps = redis.opsForList();
|
||||||
|
redisHashOps = redis.opsForHash();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Publish Message into Channel with redis PubSub
|
||||||
|
*
|
||||||
|
* @param j
|
||||||
|
*/
|
||||||
|
public void publish(JsonObject j) {
|
||||||
|
ChannelTopic ct = new ChannelTopic(String.format(Constants.INSTANT_MESSTRING_WEBIM_ONLINE_USER_PATTERN, appNodeId));
|
||||||
|
j.addProperty("node", appNodeId);
|
||||||
|
redis.convertAndSend(ct.getTopic(), j.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onMessage(Message message, byte[] bytes) {
|
||||||
|
logger.debug("[instant messaging] onMessage {}", message);
|
||||||
|
String payload = new String(message.getBody());
|
||||||
|
JsonParser parser = new JsonParser();
|
||||||
|
JsonObject j = parser.parse(payload).getAsJsonObject();
|
||||||
|
logger.debug("[instant messaging] message body {}", j.toString());
|
||||||
|
try {
|
||||||
|
NettyClients.getInstance().sendIMEventMessage(j.get("id").getAsString(),
|
||||||
|
j.get("event").getAsString(),
|
||||||
|
IMServiceUtils.deserialize(j.get("data").getAsString()));
|
||||||
|
} catch (Exception e) {
|
||||||
|
logger.error("onMessage", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -15,25 +15,19 @@
|
|||||||
*/
|
*/
|
||||||
package com.chatopera.cc.app.schedule;
|
package com.chatopera.cc.app.schedule;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.Date;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import com.chatopera.cc.app.algorithm.AutomaticServiceDist;
|
import com.chatopera.cc.app.algorithm.AutomaticServiceDist;
|
||||||
import com.chatopera.cc.app.basic.MainContext;
|
import com.chatopera.cc.app.basic.MainContext;
|
||||||
import com.chatopera.cc.app.im.client.NettyClients;
|
|
||||||
import com.chatopera.cc.app.basic.MainUtils;
|
import com.chatopera.cc.app.basic.MainUtils;
|
||||||
import com.chatopera.cc.exchange.DataExchangeInterface;
|
|
||||||
import com.chatopera.cc.util.freeswitch.model.CallCenterAgent;
|
|
||||||
import com.chatopera.cc.app.cache.CacheHelper;
|
import com.chatopera.cc.app.cache.CacheHelper;
|
||||||
import com.chatopera.cc.app.persistence.impl.CallOutQuene;
|
import com.chatopera.cc.app.im.client.NettyClients;
|
||||||
import com.chatopera.cc.app.persistence.repository.AgentUserTaskRepository;
|
|
||||||
import com.chatopera.cc.app.persistence.repository.JobDetailRepository;
|
|
||||||
import com.chatopera.cc.app.persistence.repository.OnlineUserRepository;
|
|
||||||
import com.chatopera.cc.util.OnlineUserUtils;
|
|
||||||
import com.chatopera.cc.app.im.router.OutMessageRouter;
|
|
||||||
import com.chatopera.cc.app.im.message.ChatMessage;
|
import com.chatopera.cc.app.im.message.ChatMessage;
|
||||||
|
import com.chatopera.cc.app.im.router.OutMessageRouter;
|
||||||
|
import com.chatopera.cc.app.model.*;
|
||||||
|
import com.chatopera.cc.app.persistence.impl.CallOutQuene;
|
||||||
|
import com.chatopera.cc.app.persistence.repository.*;
|
||||||
|
import com.chatopera.cc.exchange.DataExchangeInterface;
|
||||||
|
import com.chatopera.cc.util.OnlineUserUtils;
|
||||||
|
import com.chatopera.cc.util.freeswitch.model.CallCenterAgent;
|
||||||
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.Autowired;
|
||||||
import org.springframework.context.annotation.Configuration;
|
import org.springframework.context.annotation.Configuration;
|
||||||
@ -43,18 +37,10 @@ import org.springframework.data.domain.PageRequest;
|
|||||||
import org.springframework.scheduling.annotation.EnableScheduling;
|
import org.springframework.scheduling.annotation.EnableScheduling;
|
||||||
import org.springframework.scheduling.annotation.Scheduled;
|
import org.springframework.scheduling.annotation.Scheduled;
|
||||||
|
|
||||||
import com.chatopera.cc.app.persistence.repository.ChatMessageRepository;
|
import java.util.ArrayList;
|
||||||
import com.chatopera.cc.app.persistence.repository.ConsultInviteRepository;
|
import java.util.Collection;
|
||||||
import com.chatopera.cc.app.model.AgentStatus;
|
import java.util.Date;
|
||||||
import com.chatopera.cc.app.model.AgentUser;
|
import java.util.List;
|
||||||
import com.chatopera.cc.app.model.AgentUserTask;
|
|
||||||
import com.chatopera.cc.app.model.AiConfig;
|
|
||||||
import com.chatopera.cc.app.model.AiUser;
|
|
||||||
import com.chatopera.cc.app.model.CousultInvite;
|
|
||||||
import com.chatopera.cc.app.model.JobDetail;
|
|
||||||
import com.chatopera.cc.app.model.MessageOutContent;
|
|
||||||
import com.chatopera.cc.app.model.OnlineUser;
|
|
||||||
import com.chatopera.cc.app.model.SessionConfig;
|
|
||||||
|
|
||||||
@Configuration
|
@Configuration
|
||||||
@EnableScheduling
|
@EnableScheduling
|
||||||
@ -72,7 +58,7 @@ public class WebIMTask {
|
|||||||
@Autowired
|
@Autowired
|
||||||
private TaskExecutor webimTaskExecutor;
|
private TaskExecutor webimTaskExecutor;
|
||||||
|
|
||||||
@Scheduled(fixedDelay = 5000) // 每5秒执行一次
|
@Scheduled(fixedDelay = 5000) // 处理超时消息,每5秒执行一次
|
||||||
public void task() {
|
public void task() {
|
||||||
List<SessionConfig> sessionConfigList = AutomaticServiceDist.initSessionConfigList();
|
List<SessionConfig> sessionConfigList = AutomaticServiceDist.initSessionConfigList();
|
||||||
if (sessionConfigList != null && sessionConfigList.size() > 0 && MainContext.getContext() != null) {
|
if (sessionConfigList != null && sessionConfigList.size() > 0 && MainContext.getContext() != null) {
|
||||||
@ -255,7 +241,7 @@ public class WebIMTask {
|
|||||||
private void processMessage(SessionConfig sessionConfig, String message, String servicename, AgentUser agentUser, AgentStatus agentStatus, AgentUserTask task) {
|
private void processMessage(SessionConfig sessionConfig, String message, String servicename, AgentUser agentUser, AgentStatus agentStatus, AgentUserTask task) {
|
||||||
|
|
||||||
MessageOutContent outMessage = new MessageOutContent();
|
MessageOutContent outMessage = new MessageOutContent();
|
||||||
if (!StringUtils.isBlank(message)) {
|
if (StringUtils.isNotBlank(message)) {
|
||||||
outMessage.setMessage(message);
|
outMessage.setMessage(message);
|
||||||
outMessage.setMessageType(MainContext.MediaTypeEnum.TEXT.toString());
|
outMessage.setMessageType(MainContext.MediaTypeEnum.TEXT.toString());
|
||||||
outMessage.setCalltype(MainContext.CallTypeEnum.OUT.toString());
|
outMessage.setCalltype(MainContext.CallTypeEnum.OUT.toString());
|
||||||
@ -279,7 +265,7 @@ public class WebIMTask {
|
|||||||
data.setAgentserviceid(agentUser.getAgentserviceid());
|
data.setAgentserviceid(agentUser.getAgentserviceid());
|
||||||
|
|
||||||
data.setCalltype(MainContext.CallTypeEnum.OUT.toString());
|
data.setCalltype(MainContext.CallTypeEnum.OUT.toString());
|
||||||
if (!StringUtils.isBlank(agentUser.getAgentno())) {
|
if (StringUtils.isNotBlank(agentUser.getAgentno())) {
|
||||||
data.setTouser(agentUser.getUserid());
|
data.setTouser(agentUser.getUserid());
|
||||||
}
|
}
|
||||||
data.setChannel(agentUser.getChannel());
|
data.setChannel(agentUser.getChannel());
|
||||||
@ -304,11 +290,12 @@ public class WebIMTask {
|
|||||||
*/
|
*/
|
||||||
MainContext.getContext().getBean(ChatMessageRepository.class).save(data);
|
MainContext.getContext().getBean(ChatMessageRepository.class).save(data);
|
||||||
|
|
||||||
if (agentUser != null && !StringUtils.isBlank(agentUser.getAgentno())) { //同时发送消息给双方
|
// 同时发送消息给双方
|
||||||
NettyClients.getInstance().sendAgentEventMessage(agentUser.getAgentno(), MainContext.MessageTypeEnum.MESSAGE.toString(), data);
|
if (agentUser != null && StringUtils.isNotBlank(agentUser.getAgentno())) {
|
||||||
|
NettyClients.getInstance().publishAgentEventMessage(agentUser.getAgentno(), MainContext.MessageTypeEnum.MESSAGE.toString(), data);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!StringUtils.isBlank(data.getTouser())) {
|
if (StringUtils.isNotBlank(data.getTouser())) {
|
||||||
OutMessageRouter router = null;
|
OutMessageRouter router = null;
|
||||||
router = (OutMessageRouter) MainContext.getContext().getBean(agentUser.getChannel());
|
router = (OutMessageRouter) MainContext.getContext().getBean(agentUser.getChannel());
|
||||||
if (router != null) {
|
if (router != null) {
|
||||||
|
@ -16,6 +16,7 @@
|
|||||||
package com.chatopera.cc.util;
|
package com.chatopera.cc.util;
|
||||||
|
|
||||||
import com.chatopera.cc.app.basic.MainContext;
|
import com.chatopera.cc.app.basic.MainContext;
|
||||||
|
import org.apache.commons.lang.StringUtils;
|
||||||
|
|
||||||
import java.text.DecimalFormat;
|
import java.text.DecimalFormat;
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
@ -46,6 +47,17 @@ public class Constants {
|
|||||||
public final static SimpleDateFormat DISPLAY_DATE_FORMATTER = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
public final static SimpleDateFormat DISPLAY_DATE_FORMATTER = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
||||||
public final static DecimalFormat DURATION_MINS_FORMATTER = new DecimalFormat("0.00");
|
public final static DecimalFormat DURATION_MINS_FORMATTER = new DecimalFormat("0.00");
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Instant Messaging Events
|
||||||
|
*/
|
||||||
|
public final static String INSTANT_MESSTRING_WEBIM_AGENT_PATTERN = "im:webim:agent:%s:events";
|
||||||
|
public final static String INSTANT_MESSAGING_WEBIM_AGENT_CHANNEL = String.format(INSTANT_MESSTRING_WEBIM_AGENT_PATTERN, "*");
|
||||||
|
public final static String INSTANT_MESSTRING_WEBIM_ONLINE_USER_PATTERN = "im:webim:onlineuser:%s:events";
|
||||||
|
public final static String INSTANT_MESSAGING_WEBIM_ONLINE_USER_CHANNEL = String.format(INSTANT_MESSTRING_WEBIM_ONLINE_USER_PATTERN, "*");
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* FreeSwitch Communication
|
* FreeSwitch Communication
|
||||||
*/
|
*/
|
||||||
|
@ -18,6 +18,8 @@
|
|||||||
# 证书相关信息
|
# 证书相关信息
|
||||||
license.client.id=cskefu
|
license.client.id=cskefu
|
||||||
application.version=3.9.0
|
application.version=3.9.0
|
||||||
|
# 在集群状态下,每个Node都有自己唯一的ID
|
||||||
|
application.node.id=localhost
|
||||||
|
|
||||||
# security
|
# security
|
||||||
management.security.enabled=false
|
management.security.enabled=false
|
||||||
@ -131,7 +133,7 @@ spring.redis.port=6379
|
|||||||
# Redis服务器连接密码(默认为空)
|
# Redis服务器连接密码(默认为空)
|
||||||
spring.redis.password=
|
spring.redis.password=
|
||||||
# 连接池最大连接数(使用负值表示没有限制)
|
# 连接池最大连接数(使用负值表示没有限制)
|
||||||
spring.redis.pool.max-active=20
|
spring.redis.pool.max-active=-1
|
||||||
# 连接池最大阻塞等待时间(使用负值表示没有限制)
|
# 连接池最大阻塞等待时间(使用负值表示没有限制)
|
||||||
spring.redis.pool.max-wait=-1
|
spring.redis.pool.max-wait=-1
|
||||||
# 连接池中的最大空闲连接
|
# 连接池中的最大空闲连接
|
||||||
|
Loading…
x
Reference in New Issue
Block a user