mirror of
https://github.com/chatopera/cosin.git
synced 2025-08-01 16:38:02 +08:00
#75 记录机器人客服逻辑错误
This commit is contained in:
parent
87f4055b53
commit
99324f617d
@ -139,6 +139,7 @@ public class ChatbotEventHandler {
|
|||||||
agentUser.setCreatetime(now);
|
agentUser.setCreatetime(now);
|
||||||
agentUser.setUpdatetime(now);
|
agentUser.setUpdatetime(now);
|
||||||
agentUser.setSessionid(session);
|
agentUser.setSessionid(session);
|
||||||
|
|
||||||
// 聊天机器人处理的请求
|
// 聊天机器人处理的请求
|
||||||
agentUser.setOpttype(MainContext.OptTypeEnum.CHATBOT.toString());
|
agentUser.setOpttype(MainContext.OptTypeEnum.CHATBOT.toString());
|
||||||
agentUser.setAgentno(aiid); // 聊天机器人ID
|
agentUser.setAgentno(aiid); // 聊天机器人ID
|
||||||
@ -148,6 +149,11 @@ public class ChatbotEventHandler {
|
|||||||
AgentService agentService = AutomaticServiceDist.processChatbotService(agentUser, orgi);
|
AgentService agentService = AutomaticServiceDist.processChatbotService(agentUser, orgi);
|
||||||
agentUser.setAgentserviceid(agentService.getId());
|
agentUser.setAgentserviceid(agentService.getId());
|
||||||
|
|
||||||
|
// 标记为机器人坐席
|
||||||
|
agentUser.setChatbotops(true);
|
||||||
|
agentUser.setChatbotlogicerror(0);
|
||||||
|
agentUser.setChatbotround(0);
|
||||||
|
|
||||||
getAgentUserRes().save(agentUser);
|
getAgentUserRes().save(agentUser);
|
||||||
getOnlineUserRes().save(onlineUser);
|
getOnlineUserRes().save(onlineUser);
|
||||||
CacheHelper.getAgentUserCacheBean().put(user, agentUser, orgi);
|
CacheHelper.getAgentUserCacheBean().put(user, agentUser, orgi);
|
||||||
@ -198,6 +204,7 @@ public class ChatbotEventHandler {
|
|||||||
String orgi = client.getHandshakeData().getSingleUrlParam("orgi");
|
String orgi = client.getHandshakeData().getSingleUrlParam("orgi");
|
||||||
String aiid = client.getHandshakeData().getSingleUrlParam("aiid");
|
String aiid = client.getHandshakeData().getSingleUrlParam("aiid");
|
||||||
String user = client.getHandshakeData().getSingleUrlParam("userid");
|
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());
|
logger.info("[chatbot] onEvent message: orgi {}, aiid {}, userid {}, dataType {}", orgi, aiid, user, data.getType());
|
||||||
// ignore event if dataType is not message.
|
// ignore event if dataType is not message.
|
||||||
if (!StringUtils.equals(data.getType(), Constants.IM_MESSAGE_TYPE_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.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.setMessage(MainUtils.processEmoti(data.getMessage())); // 处理表情
|
||||||
|
data.setTouser(aiid);
|
||||||
data.setTousername(invite.getAiname());
|
data.setTousername(invite.getAiname());
|
||||||
|
data.setUsername(agentUser.getUsername());
|
||||||
data.setAiid(aiid);
|
data.setAiid(aiid);
|
||||||
data.setAgentserviceid(agentUser.getAgentserviceid());
|
data.setAgentserviceid(agentUser.getAgentserviceid());
|
||||||
data.setChannel(agentUser.getChannel());
|
data.setChannel(agentUser.getChannel());
|
||||||
@ -253,7 +263,6 @@ public class ChatbotEventHandler {
|
|||||||
|
|
||||||
// 发送消息给Bot
|
// 发送消息给Bot
|
||||||
MainUtils.chatbot(new ChatbotEvent<ChatMessage>(data,
|
MainUtils.chatbot(new ChatbotEvent<ChatMessage>(data,
|
||||||
getChatbotRes(),
|
|
||||||
Constants.CHATBOT_EVENT_TYPE_CHAT));
|
Constants.CHATBOT_EVENT_TYPE_CHAT));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -68,10 +68,9 @@ public class ChatbotUtils {
|
|||||||
* @param data
|
* @param data
|
||||||
* @param direction
|
* @param direction
|
||||||
* @param chatype
|
* @param chatype
|
||||||
* @param msgtype
|
|
||||||
* @return
|
* @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());
|
AgentUser agentUser = (AgentUser) CacheHelper.getAgentUserCacheBean().getCacheObject(data.getUserid(), data.getOrgi());
|
||||||
if (agentUser == null)
|
if (agentUser == null)
|
||||||
return null;
|
return null;
|
||||||
@ -79,7 +78,7 @@ public class ChatbotUtils {
|
|||||||
// 设置发送消息体
|
// 设置发送消息体
|
||||||
MessageOutContent outMessage = new MessageOutContent();
|
MessageOutContent outMessage = new MessageOutContent();
|
||||||
outMessage.setMessage(data.getMessage());
|
outMessage.setMessage(data.getMessage());
|
||||||
outMessage.setMessageType(msgtype);
|
outMessage.setMessageType(data.getMsgtype());
|
||||||
outMessage.setCalltype(direction);
|
outMessage.setCalltype(direction);
|
||||||
outMessage.setAgentUser(null);
|
outMessage.setAgentUser(null);
|
||||||
outMessage.setSnsAccount(null);
|
outMessage.setSnsAccount(null);
|
||||||
@ -87,7 +86,7 @@ public class ChatbotUtils {
|
|||||||
outMessage.setSuggest(data.getSuggest());
|
outMessage.setSuggest(data.getSuggest());
|
||||||
}
|
}
|
||||||
|
|
||||||
outMessage.setContextid(data.getUserid());
|
outMessage.setContextid(data.getContextid());
|
||||||
outMessage.setFromUser(data.getUserid());
|
outMessage.setFromUser(data.getUserid());
|
||||||
outMessage.setToUser(data.getTouser());
|
outMessage.setToUser(data.getTouser());
|
||||||
outMessage.setChannelMessage(data);
|
outMessage.setChannelMessage(data);
|
||||||
@ -140,7 +139,7 @@ public class ChatbotUtils {
|
|||||||
data.setUsession(data.getUserid()); //agentUser作为 session id
|
data.setUsession(data.getUserid()); //agentUser作为 session id
|
||||||
data.setCalltype(direction);
|
data.setCalltype(direction);
|
||||||
data.setUpdatetime(System.currentTimeMillis());
|
data.setUpdatetime(System.currentTimeMillis());
|
||||||
return createMessage(data, direction, chatype, msgtype);
|
return createMessage(data, direction, chatype);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -152,7 +151,8 @@ public class ChatbotUtils {
|
|||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
public static MessageOutContent createTextMessage(ChatMessage data, String direction, String chatype) {
|
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() {
|
private static ChatbotRepository getChatbotRes() {
|
||||||
@ -167,4 +167,12 @@ public class ChatbotUtils {
|
|||||||
return chatMessageRes;
|
return chatMessageRes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 保存到数据库,发送到ChatMessage
|
||||||
|
* @param resp
|
||||||
|
*/
|
||||||
|
public static void saveAndPublish(ChatMessage resp) {
|
||||||
|
getChatMessageRes().save(resp);
|
||||||
|
NettyClients.getInstance().sendChatbotEventMessage(resp.getUserid(), MainContext.MessageTypeEnum.MESSAGE.toString(), resp);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -90,7 +90,10 @@ public class AgentUser implements Serializable, Comparable<AgentUser> {
|
|||||||
private String email ;
|
private String email ;
|
||||||
private String phone ;
|
private String phone ;
|
||||||
private String resion ;
|
private String resion ;
|
||||||
|
private boolean chatbotops; // 是否是机器人客服
|
||||||
|
private int chatbotlogicerror; // 机器人客服逻辑错误回复累计
|
||||||
|
private int chatbotround; // 机器人客服对话轮次(一问一答是一轮)
|
||||||
|
|
||||||
@Transient
|
@Transient
|
||||||
private boolean tip = false;
|
private boolean tip = false;
|
||||||
@Transient
|
@Transient
|
||||||
@ -574,7 +577,31 @@ public class AgentUser implements Serializable, Comparable<AgentUser> {
|
|||||||
this.opttype = opttype;
|
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) {
|
public int compareTo(AgentUser o) {
|
||||||
int ret = 0 ;
|
int ret = 0 ;
|
||||||
if(this.getLogindate() == null){
|
if(this.getLogindate() == null){
|
||||||
|
@ -22,12 +22,10 @@ import com.chatopera.cc.exchange.UserEvent;
|
|||||||
public class ChatbotEvent<S> implements UserEvent {
|
public class ChatbotEvent<S> implements UserEvent {
|
||||||
|
|
||||||
private S data;
|
private S data;
|
||||||
private ChatbotRepository chatbotRes;
|
|
||||||
private String eventype;
|
private String eventype;
|
||||||
|
|
||||||
public ChatbotEvent(S data, ChatbotRepository chatbotRes, String eventype) {
|
public ChatbotEvent(S data, String eventype) {
|
||||||
this.data = data;
|
this.data = data;
|
||||||
this.chatbotRes = chatbotRes;
|
|
||||||
this.eventype = eventype;
|
this.eventype = eventype;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -39,14 +37,6 @@ public class ChatbotEvent<S> implements UserEvent {
|
|||||||
this.data = data;
|
this.data = data;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ChatbotRepository getChatbotRes() {
|
|
||||||
return chatbotRes;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setChatbotRes(ChatbotRepository chatbotRes) {
|
|
||||||
this.chatbotRes = chatbotRes;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getEventype() {
|
public String getEventype() {
|
||||||
return eventype;
|
return eventype;
|
||||||
}
|
}
|
||||||
|
@ -16,10 +16,14 @@
|
|||||||
package com.chatopera.cc.concurrent.chatbot;
|
package com.chatopera.cc.concurrent.chatbot;
|
||||||
|
|
||||||
import com.chatopera.cc.app.basic.MainContext;
|
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.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.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.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.concurrent.user.UserDataEvent;
|
||||||
import com.chatopera.cc.util.Constants;
|
import com.chatopera.cc.util.Constants;
|
||||||
import com.chatopera.chatbot.ChatbotAPIRuntimeException;
|
import com.chatopera.chatbot.ChatbotAPIRuntimeException;
|
||||||
@ -34,9 +38,28 @@ import java.net.MalformedURLException;
|
|||||||
public class ChatbotEventHandler implements EventHandler<UserDataEvent> {
|
public class ChatbotEventHandler implements EventHandler<UserDataEvent> {
|
||||||
private final static Logger logger = LoggerFactory.getLogger(ChatbotEventHandler.class);
|
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 {
|
private void chat(final ChatbotEvent payload) throws MalformedURLException, ChatbotAPIRuntimeException {
|
||||||
ChatMessage request = (ChatMessage) payload.getData();
|
ChatMessage request = (ChatMessage) payload.getData();
|
||||||
Chatbot c = payload.getChatbotRes()
|
Chatbot c = getChatbotRes()
|
||||||
.findOne(request.getAiid());
|
.findOne(request.getAiid());
|
||||||
|
|
||||||
logger.info("[chatbot disruptor] chat request baseUrl {}, chatbotID {}, fromUserId {}, textMessage {}", c.getBaseUrl(), c.getChatbotID(), request.getUserid(), request.getMessage());
|
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
|
// parse response
|
||||||
logger.info("[chatbot disruptor] chat response {}", result.toString());
|
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
|
// reply
|
||||||
|
JSONObject data = result.getJSONObject("data");
|
||||||
ChatMessage resp = new ChatMessage();
|
ChatMessage resp = new ChatMessage();
|
||||||
resp.setCalltype(MainContext.CallTypeEnum.OUT.toString());
|
resp.setCalltype(MainContext.CallTypeEnum.OUT.toString());
|
||||||
|
resp.setAppid(resp.getAppid());
|
||||||
resp.setOrgi(request.getOrgi());
|
resp.setOrgi(request.getOrgi());
|
||||||
resp.setAiid(request.getAiid());
|
resp.setAiid(request.getAiid());
|
||||||
resp.setMessage(result.getJSONObject("data").getString("string"));
|
resp.setMessage(data.getString("string"));
|
||||||
resp.setTouser(request.getUsername());
|
resp.setTouser(request.getUserid());
|
||||||
|
resp.setTousername(request.getUsername());
|
||||||
|
resp.setAgentserviceid(request.getAgentserviceid());
|
||||||
resp.setMsgtype(request.getMsgtype());
|
resp.setMsgtype(request.getMsgtype());
|
||||||
resp.setUserid(request.getUserid());
|
resp.setUserid(request.getUserid());
|
||||||
|
resp.setType(request.getType());
|
||||||
resp.setChannel(request.getChannel());
|
resp.setChannel(request.getChannel());
|
||||||
resp.setContextid(resp.getContextid());
|
resp.setContextid(request.getContextid());
|
||||||
resp.setSessionid(resp.getSessionid());
|
resp.setSessionid(request.getSessionid());
|
||||||
|
resp.setUsession(request.getUsession());
|
||||||
resp.setUsername(c.getName());
|
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 {
|
} else {
|
||||||
// TODO handle exceptions
|
// TODO handle exceptions
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onEvent(UserDataEvent event, long arg1, boolean arg2)
|
public void onEvent(UserDataEvent event, long arg1, boolean arg2)
|
||||||
throws Exception {
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -691,6 +691,9 @@ CREATE TABLE `uk_agentuser` (
|
|||||||
`agentusername` varchar(32) DEFAULT NULL COMMENT '坐席姓名',
|
`agentusername` varchar(32) DEFAULT NULL COMMENT '坐席姓名',
|
||||||
`alarm` int(10) DEFAULT '0' COMMENT '是否触发预警',
|
`alarm` int(10) DEFAULT '0' COMMENT '是否触发预警',
|
||||||
`initiator` varchar(32) DEFAULT NULL 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,
|
PRIMARY KEY (`id`) USING BTREE,
|
||||||
KEY `agentuser_userid` (`userid`) USING BTREE,
|
KEY `agentuser_userid` (`userid`) USING BTREE,
|
||||||
KEY `agentuser_orgi` (`orgi`) USING BTREE
|
KEY `agentuser_orgi` (`orgi`) USING BTREE
|
||||||
|
Loading…
x
Reference in New Issue
Block a user