diff --git a/contact-center/app/src/main/java/com/chatopera/cc/webim/util/OnlineUserUtils.java b/contact-center/app/src/main/java/com/chatopera/cc/webim/util/OnlineUserUtils.java index fabc4421..861e4917 100644 --- a/contact-center/app/src/main/java/com/chatopera/cc/webim/util/OnlineUserUtils.java +++ b/contact-center/app/src/main/java/com/chatopera/cc/webim/util/OnlineUserUtils.java @@ -67,6 +67,7 @@ public class OnlineUserUtils { /** * 更新cache + * * @param id * @param cousultInvite */ @@ -598,33 +599,39 @@ public class OnlineUserUtils { */ public static void offline(String user, String orgi) throws Exception { if (UKDataContext.getContext() != null) { - OnlineUser onlineUser = (OnlineUser) CacheHelper.getOnlineUserCacheBean().getCacheObject(user, orgi); - if (onlineUser != null) { - CousultInvite invite = OnlineUserUtils.cousult(onlineUser.getAppid(), onlineUser.getOrgi(), UKDataContext.getContext().getBean(ConsultInviteRepository.class)); - if (invite.isTraceuser()) { - onlineUser.setStatus(UKDataContext.OnlineUserOperatorStatus.OFFLINE.toString()); - onlineUser.setInvitestatus(UKDataContext.OnlineUserInviteStatus.DEFAULT.toString()); - onlineUser.setBetweentime((int) (new Date().getTime() - onlineUser.getLogintime().getTime())); - onlineUser.setUpdatetime(new Date()); - OnlineUserRepository service = UKDataContext.getContext().getBean( - OnlineUserRepository.class); - service.save(onlineUser); + try { + OnlineUser onlineUser = (OnlineUser) CacheHelper.getOnlineUserCacheBean().getCacheObject(user, orgi); + if (onlineUser != null) { + CousultInvite invite = OnlineUserUtils.cousult(onlineUser.getAppid(), onlineUser.getOrgi(), UKDataContext.getContext().getBean(ConsultInviteRepository.class)); + if (invite.isTraceuser()) { + onlineUser.setStatus(UKDataContext.OnlineUserOperatorStatus.OFFLINE.toString()); + onlineUser.setInvitestatus(UKDataContext.OnlineUserInviteStatus.DEFAULT.toString()); + onlineUser.setBetweentime((int) (new Date().getTime() - onlineUser.getLogintime().getTime())); + onlineUser.setUpdatetime(new Date()); + OnlineUserRepository service = UKDataContext.getContext().getBean( + OnlineUserRepository.class); + service.save(onlineUser); - OnlineUserHisRepository onlineHisUserRes = UKDataContext.getContext().getBean(OnlineUserHisRepository.class); - { - List hisList = onlineHisUserRes.findBySessionidAndOrgi(onlineUser.getSessionid(), orgi); - OnlineUserHis his = null; - if (hisList.size() > 0) { - his = hisList.get(0); - } else { - his = new OnlineUserHis(); + OnlineUserHisRepository onlineHisUserRes = UKDataContext.getContext().getBean(OnlineUserHisRepository.class); + { + List hisList = onlineHisUserRes.findBySessionidAndOrgi(onlineUser.getSessionid(), orgi); + OnlineUserHis his = null; + if (hisList.size() > 0) { + his = hisList.get(0); + } else { + his = new OnlineUserHis(); + } + + UKTools.copyProperties(onlineUser, his); + his.setDataid(onlineUser.getId()); + onlineHisUserRes.save(his); } - - UKTools.copyProperties(onlineUser, his); - his.setDataid(onlineUser.getId()); - onlineHisUserRes.save(his); } } + } catch (ClassCastException e) { + // #TODO workaround for + // https://github.com/chatopera/cosin/issues/75 + // AiUser is not saved, just remove from cache. } CacheHelper.getOnlineUserCacheBean().delete(user, orgi); } diff --git a/contact-center/app/src/main/java/com/chatopera/cc/webim/util/server/ServerRunner.java b/contact-center/app/src/main/java/com/chatopera/cc/webim/util/server/ServerRunner.java index 34269faa..a0e418d6 100644 --- a/contact-center/app/src/main/java/com/chatopera/cc/webim/util/server/ServerRunner.java +++ b/contact-center/app/src/main/java/com/chatopera/cc/webim/util/server/ServerRunner.java @@ -16,95 +16,108 @@ */ package com.chatopera.cc.webim.util.server; -import java.lang.reflect.Constructor; -import java.lang.reflect.InvocationTargetException; - -import com.chatopera.cc.webim.util.server.handler.ChatbotEventHandler; +import com.chatopera.cc.core.UKDataContext; +import com.chatopera.cc.webim.util.server.handler.AgentEventHandler; import com.chatopera.cc.webim.util.server.handler.EntIMEventHandler; import com.chatopera.cc.webim.util.server.handler.IMEventHandler; +import com.corundumstudio.socketio.SocketIONamespace; +import com.corundumstudio.socketio.SocketIOServer; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.context.annotation.Bean; import org.springframework.stereotype.Component; -import com.corundumstudio.socketio.SocketIONamespace; -import com.corundumstudio.socketio.SocketIOServer; -import com.chatopera.cc.core.UKDataContext; -import com.chatopera.cc.webim.util.server.handler.AgentEventHandler; +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; -@Component -public class ServerRunner implements CommandLineRunner { +@Component +public class ServerRunner implements CommandLineRunner { private final SocketIOServer server; - private final SocketIONamespace imSocketNameSpace ; - private final SocketIONamespace agentSocketIONameSpace ; - private final SocketIONamespace entIMSocketIONameSpace ; - private final SocketIONamespace chatbotSocketIONameSpace ; - private final SocketIONamespace callCenterSocketIONameSpace ; - private final SocketIONamespace calloutSocketIONameSpace ; - - @Autowired - public ServerRunner(SocketIOServer server) { - this.server = server; - imSocketNameSpace = server.addNamespace(UKDataContext.NameSpaceEnum.IM.getNamespace()) ; - agentSocketIONameSpace = server.addNamespace(UKDataContext.NameSpaceEnum.AGENT.getNamespace()) ; - entIMSocketIONameSpace = server.addNamespace(UKDataContext.NameSpaceEnum.ENTIM.getNamespace()) ; - chatbotSocketIONameSpace = server.addNamespace(UKDataContext.NameSpaceEnum.CHATBOT.getNamespace()) ; + private final SocketIONamespace imSocketNameSpace; + private final SocketIONamespace agentSocketIONameSpace; + private final SocketIONamespace entIMSocketIONameSpace; + private final SocketIONamespace chatbotSocketIONameSpace; + private final SocketIONamespace callCenterSocketIONameSpace; + private final SocketIONamespace calloutSocketIONameSpace; - if(UKDataContext.model.get("sales") != null && UKDataContext.model.get("sales") == true){ + @Autowired + public ServerRunner(SocketIOServer server) { + this.server = server; + imSocketNameSpace = server.addNamespace(UKDataContext.NameSpaceEnum.IM.getNamespace()); + agentSocketIONameSpace = server.addNamespace(UKDataContext.NameSpaceEnum.AGENT.getNamespace()); + entIMSocketIONameSpace = server.addNamespace(UKDataContext.NameSpaceEnum.ENTIM.getNamespace()); + + if (UKDataContext.model.get("sales") != null && UKDataContext.model.get("sales") == true) { calloutSocketIONameSpace = server.addNamespace(UKDataContext.NameSpaceEnum.CALLOUT.getNamespace()); } else { calloutSocketIONameSpace = null; } - if(UKDataContext.model.get("callcenter") !=null && UKDataContext.model.get("callcenter") == true){ - callCenterSocketIONameSpace = server.addNamespace(UKDataContext.NameSpaceEnum.CALLCENTER.getNamespace()) ; - }else{ - callCenterSocketIONameSpace = null ; + if (UKDataContext.model.get("callcenter") != null && UKDataContext.model.get("callcenter") == true) { + callCenterSocketIONameSpace = server.addNamespace(UKDataContext.NameSpaceEnum.CALLCENTER.getNamespace()); + } else { + callCenterSocketIONameSpace = null; + } + + if (UKDataContext.model.get("chatbot") != null && UKDataContext.model.get("chatbot") == true) { + chatbotSocketIONameSpace = server.addNamespace(UKDataContext.NameSpaceEnum.CHATBOT.getNamespace()); + } else { + chatbotSocketIONameSpace = null; } } - - @Bean(name="imNamespace") - public SocketIONamespace getIMSocketIONameSpace(SocketIOServer server ){ - imSocketNameSpace.addListeners(new IMEventHandler(server)); - return imSocketNameSpace ; - } - - @Bean(name="agentNamespace") - public SocketIONamespace getAgentSocketIONameSpace(SocketIOServer server){ - agentSocketIONameSpace.addListeners(new AgentEventHandler(server)); - return agentSocketIONameSpace; + + @Bean(name = "imNamespace") + public SocketIONamespace getIMSocketIONameSpace(SocketIOServer server) { + imSocketNameSpace.addListeners(new IMEventHandler(server)); + return imSocketNameSpace; } - @Bean(name="entimNamespace") - public SocketIONamespace getEntIMSocketIONameSpace(SocketIOServer server){ - entIMSocketIONameSpace.addListeners(new EntIMEventHandler(server)); - return entIMSocketIONameSpace; - } - - @Bean(name="chatbotNamespace") - public SocketIONamespace getChatbotSocketIONameSpace(SocketIOServer server){ - chatbotSocketIONameSpace.addListeners(new ChatbotEventHandler(server)); - return chatbotSocketIONameSpace; - } - - @Bean(name="callCenterNamespace") - public SocketIONamespace getCallCenterIMSocketIONameSpace(SocketIOServer server){ - if(UKDataContext.model.get("callcenter") !=null && UKDataContext.model.get("callcenter") == true){ - Constructor constructor; - try { - constructor = Class.forName("com.chatopera.cc.webim.util.server.handler.CallCenterEventHandler").getConstructor(new Class[]{SocketIOServer.class}); - callCenterSocketIONameSpace.addListeners(constructor.newInstance(server)); - } catch (NoSuchMethodException | SecurityException - | ClassNotFoundException | InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { - e.printStackTrace(); - } - } - return callCenterSocketIONameSpace; + @Bean(name = "agentNamespace") + public SocketIONamespace getAgentSocketIONameSpace(SocketIOServer server) { + agentSocketIONameSpace.addListeners(new AgentEventHandler(server)); + return agentSocketIONameSpace; } - @Bean(name="calloutNamespace") - public SocketIONamespace getCalloutIMSocketIONameSpace(SocketIOServer server){ - if(UKDataContext.model.get("sales") !=null && UKDataContext.model.get("sales") == true){ + @Bean(name = "entimNamespace") + public SocketIONamespace getEntIMSocketIONameSpace(SocketIOServer server) { + entIMSocketIONameSpace.addListeners(new EntIMEventHandler(server)); + return entIMSocketIONameSpace; + } + + @Bean(name = "chatbotNamespace") + public SocketIONamespace getChatbotSocketIONameSpace(SocketIOServer server) { + if (UKDataContext.model.get("chatbot") != null && UKDataContext.model.get("chatbot") == true) { + Constructor constructor; + try { + constructor = Class.forName("com.chatopera.cc.webim.util.server.handler.ChatbotEventHandler").getConstructor(new Class[]{SocketIOServer.class}); + chatbotSocketIONameSpace.addListeners(constructor.newInstance(server)); + } catch (NoSuchMethodException | SecurityException + | ClassNotFoundException | InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { + e.printStackTrace(); + } + } + return chatbotSocketIONameSpace; + + } + + @Bean(name = "callCenterNamespace") + public SocketIONamespace getCallCenterIMSocketIONameSpace(SocketIOServer server) { + if (UKDataContext.model.get("callcenter") != null && UKDataContext.model.get("callcenter") == true) { + Constructor constructor; + try { + constructor = Class.forName("com.chatopera.cc.webim.util.server.handler.CallCenterEventHandler").getConstructor(new Class[]{SocketIOServer.class}); + callCenterSocketIONameSpace.addListeners(constructor.newInstance(server)); + } catch (NoSuchMethodException | SecurityException + | ClassNotFoundException | InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { + e.printStackTrace(); + } + } + return callCenterSocketIONameSpace; + } + + @Bean(name = "calloutNamespace") + public SocketIONamespace getCalloutIMSocketIONameSpace(SocketIOServer server) { + if (UKDataContext.model.get("sales") != null && UKDataContext.model.get("sales") == true) { Constructor constructor; try { constructor = Class.forName("com.chatopera.cc.webim.util.server.handler.CalloutEventHandler").getConstructor(new Class[]{SocketIOServer.class}); @@ -117,8 +130,8 @@ public class ServerRunner implements CommandLineRunner { return calloutSocketIONameSpace; } - public void run(String... args) throws Exception { - server.start(); - UKDataContext.setIMServerStatus(true); //IMServer 启动成功 - } + public void run(String... args) throws Exception { + server.start(); + UKDataContext.setIMServerStatus(true); //IMServer 启动成功 + } } diff --git a/contact-center/app/src/main/java/com/chatopera/cc/webim/util/server/handler/ChatbotEventHandler.java b/contact-center/app/src/main/java/com/chatopera/cc/webim/util/server/handler/ChatbotEventHandler.java index b6347f0a..979d858a 100644 --- a/contact-center/app/src/main/java/com/chatopera/cc/webim/util/server/handler/ChatbotEventHandler.java +++ b/contact-center/app/src/main/java/com/chatopera/cc/webim/util/server/handler/ChatbotEventHandler.java @@ -44,155 +44,147 @@ import org.springframework.beans.factory.annotation.Autowired; import java.net.InetSocketAddress; import java.util.Date; -public class ChatbotEventHandler -{ - protected SocketIOServer server; +public class ChatbotEventHandler { + protected SocketIOServer server; @Autowired - public ChatbotEventHandler(SocketIOServer server) - { - this.server = server ; - } - - @OnConnect - public void onConnect(SocketIOClient client) - { - try { - String user = client.getHandshakeData().getSingleUrlParam("userid") ; - String orgi = client.getHandshakeData().getSingleUrlParam("orgi") ; + public ChatbotEventHandler(SocketIOServer server) { + this.server = server; + } + + @OnConnect + public void onConnect(SocketIOClient client) { + try { + String user = client.getHandshakeData().getSingleUrlParam("userid"); + String orgi = client.getHandshakeData().getSingleUrlParam("orgi"); // String session = client.getHandshakeData().getSingleUrlParam("session") ; - String appid = client.getHandshakeData().getSingleUrlParam("appid") ; - String aiid = client.getHandshakeData().getSingleUrlParam("aiid") ; + String appid = client.getHandshakeData().getSingleUrlParam("appid"); + String aiid = client.getHandshakeData().getSingleUrlParam("aiid"); // String agent = client.getHandshakeData().getSingleUrlParam("agent") ; // String skill = client.getHandshakeData().getSingleUrlParam("skill") ; - - if(!StringUtils.isBlank(user)){ + + if (StringUtils.isNotBlank(user)) { // /** // * 加入到 缓存列表 // */ - NettyClients.getInstance().putIMEventClient(user, client); - MessageOutContent outMessage = new MessageOutContent() ; - CousultInvite invite = OnlineUserUtils.cousult(appid , orgi, UKDataContext.getContext().getBean(ConsultInviteRepository.class)); - if(invite!=null && !StringUtils.isBlank(invite.getAisuccesstip())) { - outMessage.setMessage(invite.getAisuccesstip()); - }else{ - outMessage.setMessage("欢迎使用优客服小E,我来帮您解答问题"); - } - - outMessage.setMessageType(UKDataContext.MessageTypeEnum.MESSAGE.toString()); - outMessage.setCalltype(UKDataContext.CallTypeEnum.IN.toString()); - outMessage.setNickName("AI"); - outMessage.setCreatetime(UKTools.dateFormate.format(new Date())); - - client.sendEvent(UKDataContext.MessageTypeEnum.STATUS.toString(), outMessage); - - InetSocketAddress address = (InetSocketAddress) client.getRemoteAddress() ; - String ip = UKTools.getIpAddr(client.getHandshakeData().getHttpHeaders(), address.getHostString()) ; - AiUser aiUser = new AiUser(user, user, System.currentTimeMillis() , orgi,IPTools.getInstance().findGeography(ip)) ; - aiUser.setSessionid(UKTools.getContextID(client.getSessionId().toString())); - aiUser.setAppid(appid); - aiUser.setAiid(aiid); - aiUser.setUsername(UKDataContext.GUEST_USER+"_"+UKTools.genIDByKey(aiUser.getId())); - aiUser.setChannel(UKDataContext.ChannelTypeEnum.WEBIM.toString()); - - AgentService agentService = ServiceQuene.processAiService(aiUser, orgi) ; - aiUser.setAgentserviceid(agentService.getId()); - - CacheHelper.getOnlineUserCacheBean().put(user, aiUser, UKDataContext.SYSTEM_ORGI); - - } - } catch (Exception e) { - e.printStackTrace(); - } - } - - + NettyClients.getInstance().putIMEventClient(user, client); + MessageOutContent outMessage = new MessageOutContent(); + CousultInvite invite = OnlineUserUtils.cousult(appid, orgi, UKDataContext.getContext().getBean(ConsultInviteRepository.class)); + if (invite != null && !StringUtils.isBlank(invite.getAisuccesstip())) { + outMessage.setMessage(invite.getAisuccesstip()); + } else { + outMessage.setMessage("欢迎使用华夏春松机器人客服!"); + } + + outMessage.setMessageType(UKDataContext.MessageTypeEnum.MESSAGE.toString()); + outMessage.setCalltype(UKDataContext.CallTypeEnum.IN.toString()); + outMessage.setNickName("AI"); + outMessage.setCreatetime(UKTools.dateFormate.format(new Date())); + + client.sendEvent(UKDataContext.MessageTypeEnum.STATUS.toString(), outMessage); + + InetSocketAddress address = (InetSocketAddress) client.getRemoteAddress(); + String ip = UKTools.getIpAddr(client.getHandshakeData().getHttpHeaders(), address.getHostString()); + AiUser aiUser = new AiUser(user, user, System.currentTimeMillis(), orgi, IPTools.getInstance().findGeography(ip)); + aiUser.setSessionid(UKTools.getContextID(client.getSessionId().toString())); + aiUser.setAppid(appid); + aiUser.setAiid(aiid); + aiUser.setUsername(UKDataContext.GUEST_USER + "_" + UKTools.genIDByKey(aiUser.getId())); + aiUser.setChannel(UKDataContext.ChannelTypeEnum.WEBIM.toString()); + + AgentService agentService = ServiceQuene.processAiService(aiUser, orgi); + aiUser.setAgentserviceid(agentService.getId()); + + CacheHelper.getOnlineUserCacheBean().put(user, aiUser, UKDataContext.SYSTEM_ORGI); + + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + //添加@OnDisconnect事件,客户端断开连接时调用,刷新客户端信息 - @OnDisconnect - public void onDisconnect(SocketIOClient client) throws Exception - { - String user = client.getHandshakeData().getSingleUrlParam("userid") ; - String orgi = client.getHandshakeData().getSingleUrlParam("orgi") ; - if(!StringUtils.isBlank(user)){ - NettyClients.getInstance().removeIMEventClient(user , UKTools.getContextID(client.getSessionId().toString())); - AiUser aiUser = (AiUser) CacheHelper.getOnlineUserCacheBean().getCacheObject(user, orgi) ; - if(aiUser!=null) { - ServiceQuene.processAiService(aiUser, orgi) ; - CacheHelper.getOnlineUserCacheBean().delete(user,UKDataContext.SYSTEM_ORGI) ; - } - } - client.disconnect(); - } - + @OnDisconnect + public void onDisconnect(SocketIOClient client) throws Exception { + String user = client.getHandshakeData().getSingleUrlParam("userid"); + String orgi = client.getHandshakeData().getSingleUrlParam("orgi"); + if (!StringUtils.isBlank(user)) { + NettyClients.getInstance().removeIMEventClient(user, UKTools.getContextID(client.getSessionId().toString())); + AiUser aiUser = (AiUser) CacheHelper.getOnlineUserCacheBean().getCacheObject(user, orgi); + if (aiUser != null) { + ServiceQuene.processAiService(aiUser, orgi); + CacheHelper.getOnlineUserCacheBean().delete(user, UKDataContext.SYSTEM_ORGI); + } + } + client.disconnect(); + } + //消息接收入口,网站有新用户接入对话 - @OnEvent(value = "new") - public void onEvent(SocketIOClient client, AckRequest request, NewRequestMessage data) - { - - } - - //消息接收入口,坐席状态更新 - @OnEvent(value = "agentstatus") - public void onEvent(SocketIOClient client, AckRequest request, AgentStatusMessage data) - { - System.out.println(data.getMessage()); - } - + @OnEvent(value = "new") + public void onEvent(SocketIOClient client, AckRequest request, NewRequestMessage data) { + + } + + //消息接收入口,坐席状态更新 + @OnEvent(value = "agentstatus") + public void onEvent(SocketIOClient client, AckRequest request, AgentStatusMessage data) { + System.out.println(data.getMessage()); + } + //消息接收入口,收发消息,用户向坐席发送消息和 坐席向用户发送消息 - @OnEvent(value = "message") - public void onEvent(SocketIOClient client, AckRequest request, ChatMessage data) - { - String orgi = client.getHandshakeData().getSingleUrlParam("orgi") ; - String aiid = client.getHandshakeData().getSingleUrlParam("aiid") ; - String user = client.getHandshakeData().getSingleUrlParam("userid") ; - if(data.getType() == null){ - data.setType("message"); - } - /** - * 以下代码主要用于检查 访客端的字数限制 - */ - CousultInvite invite = OnlineUserUtils.cousult(data.getAppid(),data.getOrgi(), UKDataContext.getContext().getBean(ConsultInviteRepository.class)); - if(invite!=null && invite.getMaxwordsnum() > 0) { - if(!StringUtils.isBlank(data.getMessage()) && data.getMessage().length() > invite.getMaxwordsnum()){ - data.setMessage(data.getMessage().substring(0 , invite.getMaxwordsnum())); - } - }else if(!StringUtils.isBlank(data.getMessage()) && data.getMessage().length() > 300){ - data.setMessage(data.getMessage().substring(0 , 300)); - } - data.setSessionid(UKTools.getContextID(client.getSessionId().toString())); - /** - * 处理表情 - */ - data.setMessage(UKTools.processEmoti(data.getMessage())); - data.setTousername(UKDataContext.ChannelTypeEnum.AI.toString()); - - data.setAiid(aiid); - - Object cacheData = (AiUser) CacheHelper.getOnlineUserCacheBean().getCacheObject(user,orgi) ; - if(cacheData!=null && cacheData instanceof AiUser){ - AiUser aiUser = (AiUser)cacheData ; - data.setAgentserviceid(aiUser.getAgentserviceid()); - data.setChannel(aiUser.getChannel()); - /** - * 一定要设置 ContextID - */ - data.setContextid(aiUser.getAgentserviceid()); - } - MessageOutContent outMessage = MessageUtils.createAiMessage(data , data.getAppid() , data.getChannel() , UKDataContext.CallTypeEnum.IN.toString() , UKDataContext.AiItemType.USERINPUT.toString() , UKDataContext.MediaTypeEnum.TEXT.toString(), data.getUserid()) ; - if(!StringUtils.isBlank(data.getUserid()) && UKDataContext.MessageTypeEnum.MESSAGE.toString().equals(data.getType())){ - if(!StringUtils.isBlank(data.getTouser())){ - OutMessageRouter router = null ; - router = (OutMessageRouter) UKDataContext.getContext().getBean(data.getChannel()) ; - if(router!=null){ - router.handler(data.getTouser(), UKDataContext.MessageTypeEnum.MESSAGE.toString(), data.getAppid(), outMessage); - } - } - if(cacheData!=null && cacheData instanceof AiUser){ - AiUser aiUser = (AiUser)cacheData ; - aiUser.setTime(System.currentTimeMillis()); - CacheHelper.getOnlineUserCacheBean().put(user, aiUser, UKDataContext.SYSTEM_ORGI); - } - } - UKTools.ai(data); - } + @OnEvent(value = "message") + public void onEvent(SocketIOClient client, AckRequest request, ChatMessage data) { + String orgi = client.getHandshakeData().getSingleUrlParam("orgi"); + String aiid = client.getHandshakeData().getSingleUrlParam("aiid"); + String user = client.getHandshakeData().getSingleUrlParam("userid"); + if (data.getType() == null) { + data.setType("message"); + } + /** + * 以下代码主要用于检查 访客端的字数限制 + */ + CousultInvite invite = OnlineUserUtils.cousult(data.getAppid(), data.getOrgi(), UKDataContext.getContext().getBean(ConsultInviteRepository.class)); + if (invite != null && invite.getMaxwordsnum() > 0) { + if (!StringUtils.isBlank(data.getMessage()) && data.getMessage().length() > invite.getMaxwordsnum()) { + data.setMessage(data.getMessage().substring(0, invite.getMaxwordsnum())); + } + } else if (!StringUtils.isBlank(data.getMessage()) && data.getMessage().length() > 300) { + data.setMessage(data.getMessage().substring(0, 300)); + } + data.setSessionid(UKTools.getContextID(client.getSessionId().toString())); + /** + * 处理表情 + */ + data.setMessage(UKTools.processEmoti(data.getMessage())); + data.setTousername(UKDataContext.ChannelTypeEnum.AI.toString()); + + data.setAiid(aiid); + + Object cacheData = (AiUser) CacheHelper.getOnlineUserCacheBean().getCacheObject(user, orgi); + if (cacheData != null && cacheData instanceof AiUser) { + AiUser aiUser = (AiUser) cacheData; + data.setAgentserviceid(aiUser.getAgentserviceid()); + data.setChannel(aiUser.getChannel()); + /** + * 一定要设置 ContextID + */ + data.setContextid(aiUser.getAgentserviceid()); + } + MessageOutContent outMessage = MessageUtils.createAiMessage(data, data.getAppid(), data.getChannel(), UKDataContext.CallTypeEnum.IN.toString(), UKDataContext.AiItemType.USERINPUT.toString(), UKDataContext.MediaTypeEnum.TEXT.toString(), data.getUserid()); + if (!StringUtils.isBlank(data.getUserid()) && UKDataContext.MessageTypeEnum.MESSAGE.toString().equals(data.getType())) { + if (!StringUtils.isBlank(data.getTouser())) { + OutMessageRouter router = null; + router = (OutMessageRouter) UKDataContext.getContext().getBean(data.getChannel()); + if (router != null) { + router.handler(data.getTouser(), UKDataContext.MessageTypeEnum.MESSAGE.toString(), data.getAppid(), outMessage); + } + } + if (cacheData != null && cacheData instanceof AiUser) { + AiUser aiUser = (AiUser) cacheData; + aiUser.setTime(System.currentTimeMillis()); + CacheHelper.getOnlineUserCacheBean().put(user, aiUser, UKDataContext.SYSTEM_ORGI); + } + } + } } \ No newline at end of file diff --git a/contact-center/app/src/main/java/com/chatopera/cc/webim/web/handler/apps/internet/IMController.java b/contact-center/app/src/main/java/com/chatopera/cc/webim/web/handler/apps/internet/IMController.java index 261dd514..2362342e 100644 --- a/contact-center/app/src/main/java/com/chatopera/cc/webim/web/handler/apps/internet/IMController.java +++ b/contact-center/app/src/main/java/com/chatopera/cc/webim/web/handler/apps/internet/IMController.java @@ -253,7 +253,17 @@ public class IMController extends Handler { */ @RequestMapping("/online") @Menu(type = "im", subtype = "online", access = true) - public SseEmitter callable(HttpServletRequest request, HttpServletResponse response, @Valid Contacts contacts, final @Valid String orgi, final @Valid String sessionid, @Valid String appid, final @Valid String userid, @Valid String sign, final @Valid String client, final @Valid String title, final @Valid String traceid) { + public SseEmitter callable(HttpServletRequest request, + HttpServletResponse response, + @Valid Contacts contacts, + final @Valid String orgi, + final @Valid String sessionid, + @Valid String appid, + final @Valid String userid, + @Valid String sign, + final @Valid String client, + final @Valid String title, + final @Valid String traceid) { BlackEntity black = (BlackEntity) CacheHelper.getSystemCacheBean().getCacheObject(userid, orgi); SseEmitter retSseEmitter = null; if ((black == null || (black.getEndtime() != null && black.getEndtime().before(new Date())))) { @@ -288,9 +298,21 @@ public class IMController extends Handler { contacts = processContacts(orgi, contacts, appid, userid); } if (StringUtils.isNotBlank(sign)) { - OnlineUserUtils.online(super.getIMUser(request, sign, contacts != null ? contacts.getName() : null), orgi, sessionid, UKDataContext.OnlineUserTypeStatus.WEBIM.toString(), request, UKDataContext.ChannelTypeEnum.WEBIM.toString(), appid, contacts, invite); + try { + OnlineUserUtils.online(super.getIMUser(request, sign, contacts != null ? contacts.getName() : null), + orgi, + sessionid, + UKDataContext.OnlineUserTypeStatus.WEBIM.toString(), + request, + UKDataContext.ChannelTypeEnum.WEBIM.toString(), + appid, + contacts, + invite); + } catch (java.lang.ClassCastException e) { + // #TODO workaround for + // https://github.com/chatopera/cosin/issues/75 + } } - OnlineUserUtils.webIMClients.putClient(userid, new WebIMClient(userid, client, emitter)); } }