1
0
mirror of https://github.com/chatopera/cosin.git synced 2025-08-01 16:38:02 +08:00

#75 记录机器人客服逻辑错误

This commit is contained in:
Hai Liang Wang 2018-09-13 17:53:34 +08:00
parent 87f4055b53
commit 99324f617d
6 changed files with 121 additions and 30 deletions

View File

@ -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<ChatMessage>(data,
getChatbotRes(),
Constants.CHATBOT_EVENT_TYPE_CHAT));
}

View File

@ -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);
}
}

View File

@ -90,6 +90,9 @@ public class AgentUser implements Serializable, Comparable<AgentUser> {
private String email ;
private String phone ;
private String resion ;
private boolean chatbotops; // 是否是机器人客服
private int chatbotlogicerror; // 机器人客服逻辑错误回复累计
private int chatbotround; // 机器人客服对话轮次(一问一答是一轮)
@Transient
private boolean tip = false;
@ -574,7 +577,31 @@ public class AgentUser implements Serializable, Comparable<AgentUser> {
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){

View File

@ -22,12 +22,10 @@ import com.chatopera.cc.exchange.UserEvent;
public class ChatbotEvent<S> 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<S> implements UserEvent {
this.data = data;
}
public ChatbotRepository getChatbotRes() {
return chatbotRes;
}
public void setChatbotRes(ChatbotRepository chatbotRes) {
this.chatbotRes = chatbotRes;
}
public String getEventype() {
return eventype;
}

View File

@ -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<UserDataEvent> {
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<UserDataEvent> {
// 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<UserDataEvent> {
}
}
/**
* 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;
}
}

View File

@ -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