diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/im/handler/ChatbotEventHandler.java b/contact-center/app/src/main/java/com/chatopera/cc/app/im/handler/ChatbotEventHandler.java index 3e2ecd4e..75545802 100644 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/im/handler/ChatbotEventHandler.java +++ b/contact-center/app/src/main/java/com/chatopera/cc/app/im/handler/ChatbotEventHandler.java @@ -139,6 +139,7 @@ public class ChatbotEventHandler { agentUser.setCreatetime(now); agentUser.setUpdatetime(now); agentUser.setSessionid(session); + // 聊天机器人处理的请求 agentUser.setOpttype(MainContext.OptTypeEnum.CHATBOT.toString()); agentUser.setAgentno(aiid); // 聊天机器人ID @@ -148,6 +149,11 @@ public class ChatbotEventHandler { AgentService agentService = AutomaticServiceDist.processChatbotService(agentUser, orgi); agentUser.setAgentserviceid(agentService.getId()); + // 标记为机器人坐席 + agentUser.setChatbotops(true); + agentUser.setChatbotlogicerror(0); + agentUser.setChatbotround(0); + getAgentUserRes().save(agentUser); getOnlineUserRes().save(onlineUser); CacheHelper.getAgentUserCacheBean().put(user, agentUser, orgi); @@ -198,6 +204,7 @@ public class ChatbotEventHandler { String orgi = client.getHandshakeData().getSingleUrlParam("orgi"); String aiid = client.getHandshakeData().getSingleUrlParam("aiid"); String user = client.getHandshakeData().getSingleUrlParam("userid"); + String sessionid = MainUtils.getContextID(client.getSessionId().toString()); logger.info("[chatbot] onEvent message: orgi {}, aiid {}, userid {}, dataType {}", orgi, aiid, user, data.getType()); // ignore event if dataType is not message. if (!StringUtils.equals(data.getType(), Constants.IM_MESSAGE_TYPE_MESSAGE)) { @@ -231,9 +238,12 @@ public class ChatbotEventHandler { data.setMessage(data.getMessage().substring(0, 300)); } - data.setSessionid(MainUtils.getContextID(client.getSessionId().toString())); + data.setUsession(user); // 绑定唯一用户 + data.setSessionid(sessionid); data.setMessage(MainUtils.processEmoti(data.getMessage())); // 处理表情 + data.setTouser(aiid); data.setTousername(invite.getAiname()); + data.setUsername(agentUser.getUsername()); data.setAiid(aiid); data.setAgentserviceid(agentUser.getAgentserviceid()); data.setChannel(agentUser.getChannel()); @@ -253,7 +263,6 @@ public class ChatbotEventHandler { // 发送消息给Bot MainUtils.chatbot(new ChatbotEvent(data, - getChatbotRes(), Constants.CHATBOT_EVENT_TYPE_CHAT)); } diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/im/util/ChatbotUtils.java b/contact-center/app/src/main/java/com/chatopera/cc/app/im/util/ChatbotUtils.java index 9e41aeab..426b5582 100644 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/im/util/ChatbotUtils.java +++ b/contact-center/app/src/main/java/com/chatopera/cc/app/im/util/ChatbotUtils.java @@ -68,10 +68,9 @@ public class ChatbotUtils { * @param data * @param direction * @param chatype - * @param msgtype * @return */ - private static MessageOutContent createMessage(ChatMessage data, String direction, String chatype, String msgtype) { + private static MessageOutContent createMessage(ChatMessage data, String direction, String chatype) { AgentUser agentUser = (AgentUser) CacheHelper.getAgentUserCacheBean().getCacheObject(data.getUserid(), data.getOrgi()); if (agentUser == null) return null; @@ -79,7 +78,7 @@ public class ChatbotUtils { // 设置发送消息体 MessageOutContent outMessage = new MessageOutContent(); outMessage.setMessage(data.getMessage()); - outMessage.setMessageType(msgtype); + outMessage.setMessageType(data.getMsgtype()); outMessage.setCalltype(direction); outMessage.setAgentUser(null); outMessage.setSnsAccount(null); @@ -87,7 +86,7 @@ public class ChatbotUtils { outMessage.setSuggest(data.getSuggest()); } - outMessage.setContextid(data.getUserid()); + outMessage.setContextid(data.getContextid()); outMessage.setFromUser(data.getUserid()); outMessage.setToUser(data.getTouser()); outMessage.setChannelMessage(data); @@ -140,7 +139,7 @@ public class ChatbotUtils { data.setUsession(data.getUserid()); //agentUser作为 session id data.setCalltype(direction); data.setUpdatetime(System.currentTimeMillis()); - return createMessage(data, direction, chatype, msgtype); + return createMessage(data, direction, chatype); } /** @@ -152,7 +151,8 @@ public class ChatbotUtils { * @return */ public static MessageOutContent createTextMessage(ChatMessage data, String direction, String chatype) { - return createMessage(data, direction, chatype, MainContext.MediaTypeEnum.TEXT.toString()); + data.setMsgtype(MainContext.MediaTypeEnum.TEXT.toString()); + return createMessage(data, direction, chatype); } private static ChatbotRepository getChatbotRes() { @@ -167,4 +167,12 @@ public class ChatbotUtils { return chatMessageRes; } + /** + * 保存到数据库,发送到ChatMessage + * @param resp + */ + public static void saveAndPublish(ChatMessage resp) { + getChatMessageRes().save(resp); + NettyClients.getInstance().sendChatbotEventMessage(resp.getUserid(), MainContext.MessageTypeEnum.MESSAGE.toString(), resp); + } } diff --git a/contact-center/app/src/main/java/com/chatopera/cc/app/model/AgentUser.java b/contact-center/app/src/main/java/com/chatopera/cc/app/model/AgentUser.java index aae34958..1b495a67 100644 --- a/contact-center/app/src/main/java/com/chatopera/cc/app/model/AgentUser.java +++ b/contact-center/app/src/main/java/com/chatopera/cc/app/model/AgentUser.java @@ -90,7 +90,10 @@ public class AgentUser implements Serializable, Comparable { private String email ; private String phone ; private String resion ; - + private boolean chatbotops; // 是否是机器人客服 + private int chatbotlogicerror; // 机器人客服逻辑错误回复累计 + private int chatbotround; // 机器人客服对话轮次(一问一答是一轮) + @Transient private boolean tip = false; @Transient @@ -574,7 +577,31 @@ public class AgentUser implements Serializable, Comparable { this.opttype = opttype; } - @Override + public boolean isChatbotops() { + return chatbotops; + } + + public void setChatbotops(boolean chatbotops) { + this.chatbotops = chatbotops; + } + + public int getChatbotlogicerror() { + return chatbotlogicerror; + } + + public void setChatbotlogicerror(int chatbotlogicerror) { + this.chatbotlogicerror = chatbotlogicerror; + } + + public int getChatbotround() { + return chatbotround; + } + + public void setChatbotround(int chatbotround) { + this.chatbotround = chatbotround; + } + + @Override public int compareTo(AgentUser o) { int ret = 0 ; if(this.getLogindate() == null){ diff --git a/contact-center/app/src/main/java/com/chatopera/cc/concurrent/chatbot/ChatbotEvent.java b/contact-center/app/src/main/java/com/chatopera/cc/concurrent/chatbot/ChatbotEvent.java index db30ae7e..8fc01072 100644 --- a/contact-center/app/src/main/java/com/chatopera/cc/concurrent/chatbot/ChatbotEvent.java +++ b/contact-center/app/src/main/java/com/chatopera/cc/concurrent/chatbot/ChatbotEvent.java @@ -22,12 +22,10 @@ import com.chatopera.cc.exchange.UserEvent; public class ChatbotEvent implements UserEvent { private S data; - private ChatbotRepository chatbotRes; private String eventype; - public ChatbotEvent(S data, ChatbotRepository chatbotRes, String eventype) { + public ChatbotEvent(S data, String eventype) { this.data = data; - this.chatbotRes = chatbotRes; this.eventype = eventype; } @@ -39,14 +37,6 @@ public class ChatbotEvent implements UserEvent { this.data = data; } - public ChatbotRepository getChatbotRes() { - return chatbotRes; - } - - public void setChatbotRes(ChatbotRepository chatbotRes) { - this.chatbotRes = chatbotRes; - } - public String getEventype() { return eventype; } diff --git a/contact-center/app/src/main/java/com/chatopera/cc/concurrent/chatbot/ChatbotEventHandler.java b/contact-center/app/src/main/java/com/chatopera/cc/concurrent/chatbot/ChatbotEventHandler.java index 66a7ce39..71d7c2af 100644 --- a/contact-center/app/src/main/java/com/chatopera/cc/concurrent/chatbot/ChatbotEventHandler.java +++ b/contact-center/app/src/main/java/com/chatopera/cc/concurrent/chatbot/ChatbotEventHandler.java @@ -16,10 +16,14 @@ package com.chatopera.cc.concurrent.chatbot; import com.chatopera.cc.app.basic.MainContext; +import com.chatopera.cc.app.cache.CacheHelper; import com.chatopera.cc.app.handler.api.request.RestUtils; -import com.chatopera.cc.app.im.client.NettyClients; import com.chatopera.cc.app.im.message.ChatMessage; +import com.chatopera.cc.app.im.util.ChatbotUtils; +import com.chatopera.cc.app.model.AgentUser; import com.chatopera.cc.app.model.Chatbot; +import com.chatopera.cc.app.persistence.repository.AgentUserRepository; +import com.chatopera.cc.app.persistence.repository.ChatbotRepository; import com.chatopera.cc.concurrent.user.UserDataEvent; import com.chatopera.cc.util.Constants; import com.chatopera.chatbot.ChatbotAPIRuntimeException; @@ -34,9 +38,28 @@ import java.net.MalformedURLException; public class ChatbotEventHandler implements EventHandler { private final static Logger logger = LoggerFactory.getLogger(ChatbotEventHandler.class); + private ChatbotRepository chatbotRes; + private AgentUserRepository agentUserRes; + + /** + * 根据聊天机器人返回数据更新agentUser + * + * @param userid + * @param data + */ + private void updateAgentUserWithRespData(final String userid, final String orgi, final JSONObject data) { + AgentUser agentUser = (AgentUser) CacheHelper.getAgentUserCacheBean().getCacheObject(userid, orgi); + agentUser.setChatbotround(agentUser.getChatbotround() + 1); + if (data.getBoolean("logic_is_unexpected")) { + agentUser.setChatbotlogicerror(agentUser.getChatbotlogicerror() + 1); + } + getAgentUserRes().save(agentUser); + CacheHelper.getAgentUserCacheBean().put(userid, agentUser, orgi); + } + private void chat(final ChatbotEvent payload) throws MalformedURLException, ChatbotAPIRuntimeException { ChatMessage request = (ChatMessage) payload.getData(); - Chatbot c = payload.getChatbotRes() + Chatbot c = getChatbotRes() .findOne(request.getAiid()); logger.info("[chatbot disruptor] chat request baseUrl {}, chatbotID {}, fromUserId {}, textMessage {}", c.getBaseUrl(), c.getChatbotID(), request.getUserid(), request.getMessage()); @@ -46,27 +69,35 @@ public class ChatbotEventHandler implements EventHandler { // parse response logger.info("[chatbot disruptor] chat response {}", result.toString()); - if(result.getInt(RestUtils.RESP_KEY_RC) == 0){ + if (result.getInt(RestUtils.RESP_KEY_RC) == 0) { // reply + JSONObject data = result.getJSONObject("data"); ChatMessage resp = new ChatMessage(); resp.setCalltype(MainContext.CallTypeEnum.OUT.toString()); + resp.setAppid(resp.getAppid()); resp.setOrgi(request.getOrgi()); resp.setAiid(request.getAiid()); - resp.setMessage(result.getJSONObject("data").getString("string")); - resp.setTouser(request.getUsername()); + resp.setMessage(data.getString("string")); + resp.setTouser(request.getUserid()); + resp.setTousername(request.getUsername()); + resp.setAgentserviceid(request.getAgentserviceid()); resp.setMsgtype(request.getMsgtype()); resp.setUserid(request.getUserid()); + resp.setType(request.getType()); resp.setChannel(request.getChannel()); - resp.setContextid(resp.getContextid()); - resp.setSessionid(resp.getSessionid()); + resp.setContextid(request.getContextid()); + resp.setSessionid(request.getSessionid()); + resp.setUsession(request.getUsession()); resp.setUsername(c.getName()); - NettyClients.getInstance().sendChatbotEventMessage(request.getUserid(), MainContext.MessageTypeEnum.MESSAGE.toString(), resp); + resp.setUpdatetime(System.currentTimeMillis()); + + updateAgentUserWithRespData(request.getUserid(), request.getOrgi(), data); // 更新聊天机器人累计值 + ChatbotUtils.saveAndPublish(resp); // 保存并发送 } else { // TODO handle exceptions } } - @Override public void onEvent(UserDataEvent event, long arg1, boolean arg2) throws Exception { @@ -81,4 +112,27 @@ public class ChatbotEventHandler implements EventHandler { } } + /** + * Lazy load agentUser repo + * + * @return + */ + private AgentUserRepository getAgentUserRes() { + if (agentUserRes == null) + agentUserRes = MainContext.getContext().getBean(AgentUserRepository.class); + return agentUserRes; + } + + + /** + * Lazy load chatbot repo + * + * @return + */ + private ChatbotRepository getChatbotRes() { + if (chatbotRes == null) + chatbotRes = MainContext.getContext().getBean(ChatbotRepository.class); + return chatbotRes; + } + } diff --git a/contact-center/config/sql/cskefu-MySQL-slim.sql b/contact-center/config/sql/cskefu-MySQL-slim.sql index b2ba8da3..c4457976 100644 --- a/contact-center/config/sql/cskefu-MySQL-slim.sql +++ b/contact-center/config/sql/cskefu-MySQL-slim.sql @@ -691,6 +691,9 @@ CREATE TABLE `uk_agentuser` ( `agentusername` varchar(32) DEFAULT NULL COMMENT '坐席姓名', `alarm` int(10) DEFAULT '0' COMMENT '是否触发预警', `initiator` varchar(32) DEFAULT NULL COMMENT '会话发起方', + `chatbotops` tinyint(1) DEFAULT '0' COMMENT '是否是机器人客服', + `chatbotlogicerror` int(11) DEFAULT '0' COMMENT '机器人客服不符合逻辑返回累计', + `chatbotround` int(11) DEFAULT '0' COMMENT '机器人客服对话轮次', PRIMARY KEY (`id`) USING BTREE, KEY `agentuser_userid` (`userid`) USING BTREE, KEY `agentuser_orgi` (`orgi`) USING BTREE