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

#75 enable chatbox for chatbot in client HTML Pages

This commit is contained in:
Hai Liang Wang 2018-09-11 22:12:09 +08:00
parent 546b8e6ddc
commit 1891891e4a
9 changed files with 1272 additions and 1388 deletions

View File

@ -928,7 +928,7 @@ public class UKDataContext {
}
}
public enum AiType {
public enum ChatbotType {
SMARTAI,
BUSINESSAI;
@ -938,7 +938,7 @@ public class UKDataContext {
}
public enum AiBussType {
public enum ChatbotBussType {
SALE,
QUESURVEY;

View File

@ -22,7 +22,7 @@ import java.util.HashSet;
public class ChatbotUtils {
public static final HashSet<String> VALID_LANGS = new HashSet<String>(Arrays.asList(new String[]{"zh_CN", "en_US"}));
public static final String CHATBOT_FIRST = "客服机器人优先";
public static final String CHATBOT_FIRST = "机器人客服优先";
public static final String HUMAN_FIRST = "人工客服优先";
public static final HashSet<String> VALID_WORKMODELS = new HashSet<String>(Arrays.asList(new String[]{CHATBOT_FIRST, HUMAN_FIRST}));

View File

@ -1,200 +0,0 @@
/*
* Copyright (C) 2017 优客服-多渠道客服系统
* Modifications 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.webim.util.server.handler;
import java.net.InetSocketAddress;
import java.util.Date;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import com.corundumstudio.socketio.AckRequest;
import com.corundumstudio.socketio.SocketIOClient;
import com.corundumstudio.socketio.SocketIOServer;
import com.corundumstudio.socketio.annotation.OnConnect;
import com.corundumstudio.socketio.annotation.OnDisconnect;
import com.corundumstudio.socketio.annotation.OnEvent;
import com.chatopera.cc.core.UKDataContext;
import com.chatopera.cc.util.IPTools;
import com.chatopera.cc.util.UKTools;
import com.chatopera.cc.util.client.NettyClients;
import com.chatopera.cc.webim.service.acd.ServiceQuene;
import com.chatopera.cc.webim.service.cache.CacheHelper;
import com.chatopera.cc.webim.service.repository.ConsultInviteRepository;
import com.chatopera.cc.webim.util.MessageUtils;
import com.chatopera.cc.webim.util.OnlineUserUtils;
import com.chatopera.cc.webim.util.router.OutMessageRouter;
import com.chatopera.cc.webim.util.server.message.AgentStatusMessage;
import com.chatopera.cc.webim.util.server.message.ChatMessage;
import com.chatopera.cc.webim.util.server.message.NewRequestMessage;
import com.chatopera.cc.webim.web.model.AgentService;
import com.chatopera.cc.webim.web.model.AiUser;
import com.chatopera.cc.webim.web.model.CousultInvite;
import com.chatopera.cc.webim.web.model.MessageOutContent;
public class AiIMEventHandler
{
protected SocketIOServer server;
@Autowired
public AiIMEventHandler(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 agent = client.getHandshakeData().getSingleUrlParam("agent") ;
// String skill = client.getHandshakeData().getSingleUrlParam("skill") ;
if(!StringUtils.isBlank(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();
}
}
//添加@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();
}
//消息接收入口网站有新用户接入对话
@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);
}
}

View File

@ -154,6 +154,7 @@ public class ApiChatbotController extends Handler {
CousultInvite invite = OnlineUserUtils.cousult(c.getSnsAccountIdentifier(), c.getOrgi(), consultInviteRes);
invite.setAi(isEnabled);
consultInviteRes.save(invite);
OnlineUserUtils.cacheCousult(invite);
resp.addProperty(RestUtils.RESP_KEY_RC, RestUtils.RESP_RC_SUCC);
resp.addProperty(RestUtils.RESP_KEY_DATA, "完成。");
@ -256,6 +257,7 @@ public class ApiChatbotController extends Handler {
c.setUpdatetime(new Date());
chatbotRes.save(c);
consultInviteRes.save(invite);
OnlineUserUtils.cacheCousult(invite);
return resp;
}
@ -321,7 +323,6 @@ public class ApiChatbotController extends Handler {
resp.addProperty("totalElements", records.getTotalElements()); // 所有检索结果数量
return resp;
}
/**
@ -360,6 +361,7 @@ public class ApiChatbotController extends Handler {
invite.setAifirst(false);
invite.setAiid(null);
consultInviteRes.save(invite);
OnlineUserUtils.cacheCousult(invite);
}
chatbotRes.delete(c);
resp.addProperty(RestUtils.RESP_KEY_RC, RestUtils.RESP_RC_SUCC);
@ -519,6 +521,7 @@ public class ApiChatbotController extends Handler {
invite.setAiname(c.getName());
invite.setAimsg(c.getWelcome());
consultInviteRes.save(invite);
OnlineUserUtils.cacheCousult(invite);
chatbotRes.save(c);
JsonObject data = new JsonObject();

View File

@ -19,7 +19,6 @@ package com.chatopera.cc.webim.web.handler.apps.internet;
import com.chatopera.cc.core.UKDataContext;
import com.chatopera.cc.util.*;
import com.chatopera.cc.util.extra.DataExchangeInterface;
import com.chatopera.cc.util.webim.WebIMClient;
import com.chatopera.cc.webim.service.acd.ServiceQuene;
import com.chatopera.cc.webim.service.cache.CacheHelper;
@ -31,6 +30,8 @@ import com.chatopera.cc.webim.web.handler.Handler;
import com.chatopera.cc.webim.web.model.*;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang.StringUtils;
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.domain.Page;
@ -57,13 +58,14 @@ import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
@Controller
@RequestMapping("/im")
@EnableAsync
public class IMController extends Handler {
private final static Logger logger = LoggerFactory.getLogger(IMController.class);
@Value("${uk.im.server.host}")
private String host;
@ -115,7 +117,7 @@ public class IMController extends Handler {
@Valid String aiid) {
ModelAndView view = request(super.createRequestPageTempletResponse("/apps/im/point"));
String sessionid = request.getSession().getId();
if (!StringUtils.isBlank(id)) {
if (StringUtils.isNotBlank(id)) {
view.addObject("hostname", request.getServerName());
SystemConfig systemConfig = UKTools.getSystemConfig();
@ -147,15 +149,15 @@ public class IMController extends Handler {
view.addObject("orgi", invite.getOrgi());
view.addObject("appid", id);
if (!StringUtils.isBlank(aiid)) {
if (StringUtils.isNotBlank(aiid)) {
view.addObject("aiid", aiid);
} else if (!StringUtils.isBlank(invite.getAiid())) {
} else if (StringUtils.isNotBlank(invite.getAiid())) {
view.addObject("aiid", invite.getAiid());
}
//记录用户行为日志
UserHistory userHistory = new UserHistory();
String url = request.getHeader("referer");
if (!StringUtils.isBlank(url)) {
if (StringUtils.isNotBlank(url)) {
if (url.length() > 255) {
userHistory.setUrl(url.substring(0, 255));
} else {
@ -177,7 +179,7 @@ public class IMController extends Handler {
userHistory.setUsername(imUser.getUsername());
userHistory.setOrgi(orgi);
}
if (!StringUtils.isBlank(title)) {
if (StringUtils.isNotBlank(title)) {
if (title.length() > 255) {
userHistory.setTitle(title.substring(0, 255));
} else {
@ -229,7 +231,7 @@ public class IMController extends Handler {
@Menu(type = "im", subtype = "inlist", access = true)
public void inlist(HttpServletRequest request, HttpServletResponse response, @PathVariable String id, @Valid String userid) throws IOException {
response.setHeader("Content-Type", "text/html;charset=utf-8");
if (!StringUtils.isBlank(userid)) {
if (StringUtils.isNotBlank(userid)) {
BlackEntity black = (BlackEntity) CacheHelper.getSystemCacheBean().getCacheObject(userid, UKDataContext.SYSTEM_ORGI);
if ((black != null && (black.getEndtime() == null || black.getEndtime().after(new Date())))) {
response.getWriter().write("in");
@ -257,7 +259,7 @@ public class IMController extends Handler {
if ((black == null || (black.getEndtime() != null && black.getEndtime().before(new Date())))) {
final SseEmitter emitter = new SseEmitter(30000L);
if (CacheHelper.getSystemCacheBean().getCacheObject(userid, orgi) == null) {
if (!StringUtils.isBlank(userid)) {
if (StringUtils.isNotBlank(userid)) {
emitter.onCompletion(new Runnable() {
@Override
public void run() {
@ -285,7 +287,7 @@ public class IMController extends Handler {
if (invite != null && invite.isTraceuser()) {
contacts = processContacts(orgi, contacts, appid, userid);
}
if (!StringUtils.isBlank(sign)) {
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);
}
@ -325,10 +327,10 @@ public class IMController extends Handler {
@Valid String purl) throws Exception {
ModelAndView view = request(super.createRequestPageTempletResponse("/apps/im/index"));
BlackEntity black = (BlackEntity) CacheHelper.getSystemCacheBean().getCacheObject(userid, UKDataContext.SYSTEM_ORGI);
if (!StringUtils.isBlank(appid) && (black == null || (black.getEndtime() != null && black.getEndtime().before(new Date())))) {
if (StringUtils.isNotBlank(appid) && (black == null || (black.getEndtime() != null && black.getEndtime().before(new Date())))) {
CousultInvite invite = OnlineUserUtils.cousult(appid, orgi, inviteRepository);
String userID = null;
if (!StringUtils.isBlank(userid)) {
if (StringUtils.isNotBlank(userid)) {
userID = UKTools.genIDByKey(userid);
} else {
userID = UKTools.genIDByKey(sessionid);
@ -338,8 +340,6 @@ public class IMController extends Handler {
SessionConfig sessionConfig = ServiceQuene.initSessionConfig(orgi);
map.addAttribute("sessionConfig", sessionConfig);
map.addAttribute("hostname", request.getServerName());
if (sslPort != null) {
@ -361,16 +361,16 @@ public class IMController extends Handler {
map.addAttribute("ip", UKTools.md5(request.getRemoteAddr()));
if (!StringUtils.isBlank(traceid)) {
if (StringUtils.isNotBlank(traceid)) {
map.addAttribute("traceid", traceid);
}
if (!StringUtils.isBlank(exchange)) {
if (StringUtils.isNotBlank(exchange)) {
map.addAttribute("exchange", exchange);
}
if (!StringUtils.isBlank(title)) {
if (StringUtils.isNotBlank(title)) {
map.addAttribute("title", title);
}
if (!StringUtils.isBlank(traceid)) {
if (StringUtils.isNotBlank(traceid)) {
map.addAttribute("url", url);
}
@ -382,9 +382,9 @@ public class IMController extends Handler {
map.addAttribute("orgi", invite.getOrgi());
map.addAttribute("inviteData", invite);
if (!StringUtils.isBlank(aiid)) {
if (StringUtils.isNotBlank(aiid)) {
map.addAttribute("aiid", aiid);
} else if (!StringUtils.isBlank(invite.getAiid())) {
} else if (StringUtils.isNotBlank(invite.getAiid())) {
map.addAttribute("aiid", invite.getAiid());
}
@ -394,24 +394,24 @@ public class IMController extends Handler {
view = request(super.createRequestPageTempletResponse("/apps/im/leavemsg"));
} else if (invite.isConsult_info()) { //启用了信息收集 , 从Request获取 或从 Cookies 里去
//验证 OnlineUser 信息
if (contacts != null && !StringUtils.isBlank(contacts.getName())) { //contacts用于传递信息并不和 联系人表发生 关联contacts信息传递给 Socket.IO然后赋值给 AgentUser最终赋值给 AgentService永久存储
if (contacts != null && StringUtils.isNotBlank(contacts.getName())) { //contacts用于传递信息并不和 联系人表发生 关联contacts信息传递给 Socket.IO然后赋值给 AgentUser最终赋值给 AgentService永久存储
consult = true;
//存入 Cookies
if (invite.isConsult_info_cookies()) {
Cookie name = new Cookie("name", UKTools.encryption(URLEncoder.encode(contacts.getName(), "UTF-8")));
response.addCookie(name);
name.setMaxAge(3600);
if (!StringUtils.isBlank(contacts.getPhone())) {
if (StringUtils.isNotBlank(contacts.getPhone())) {
Cookie phonecookie = new Cookie("phone", UKTools.encryption(URLEncoder.encode(contacts.getPhone(), "UTF-8")));
phonecookie.setMaxAge(3600);
response.addCookie(phonecookie);
}
if (!StringUtils.isBlank(contacts.getEmail())) {
if (StringUtils.isNotBlank(contacts.getEmail())) {
Cookie email = new Cookie("email", UKTools.encryption(URLEncoder.encode(contacts.getEmail(), "UTF-8")));
email.setMaxAge(3600);
response.addCookie(email);
}
if (!StringUtils.isBlank(contacts.getMemo())) {
if (StringUtils.isNotBlank(contacts.getMemo())) {
Cookie memo = new Cookie("memo", UKTools.encryption(URLEncoder.encode(contacts.getName(), "UTF-8")));
memo.setMaxAge(3600);
response.addCookie(memo);
@ -424,7 +424,7 @@ public class IMController extends Handler {
contacts = new Contacts();
if (cookies != null) {
for (Cookie cookie : cookies) {
if (cookie != null && !StringUtils.isBlank(cookie.getName()) && !StringUtils.isBlank(cookie.getValue())) {
if (cookie != null && StringUtils.isNotBlank(cookie.getName()) && StringUtils.isNotBlank(cookie.getValue())) {
if (cookie.getName().equals("name")) {
contacts.setName(URLDecoder.decode(UKTools.decryption(cookie.getValue()), "UTF-8"));
}
@ -450,33 +450,33 @@ public class IMController extends Handler {
contacts = processContacts(invite.getOrgi(), contacts, appid, userid);
}
if (!StringUtils.isBlank(client)) {
if (StringUtils.isNotBlank(client)) {
map.addAttribute("client", client);
}
if (!StringUtils.isBlank(skill)) {
if (StringUtils.isNotBlank(skill)) {
map.addAttribute("skill", skill);
}
if (!StringUtils.isBlank(agent)) {
if (StringUtils.isNotBlank(agent)) {
map.addAttribute("agent", agent);
}
map.addAttribute("contacts", contacts);
if (!StringUtils.isBlank(type)) {
if (StringUtils.isNotBlank(type)) {
map.addAttribute("type", type);
}
IP ipdata = IPTools.getInstance().findGeography(UKTools.getIpAddr(request));
map.addAttribute("skillList", OnlineUserUtils.organ(invite.getOrgi(), ipdata, invite, true));
if (invite != null && consult) {
if (contacts != null && !StringUtils.isBlank(contacts.getName())) {
if (contacts != null && StringUtils.isNotBlank(contacts.getName())) {
nickname = contacts.getName();
}
map.addAttribute("username", nickname);
if (UKDataContext.model.get("chatbot") != null &&
StringUtils.isNotBlank(invite.getAiid()) &&
invite.isAi() &&
invite.isAifirst()) { //启用 AI 并且 AI优先 接待
((StringUtils.equals(ai, "true")) || (invite.isAifirst() && ai == null))) { //启用 AI 并且 AI优先 接待
HashMap<String, String> chatbotConfig = new HashMap<String, String>();
chatbotConfig.put("botname", invite.getAiname());
chatbotConfig.put("botid", invite.getAiid());
@ -487,11 +487,11 @@ public class IMController extends Handler {
map.addAttribute("chatbotConfig", chatbotConfig);
}
view = request(super.createRequestPageTempletResponse("/apps/im/chatbot/index"));
if (CheckMobile.check(request.getHeader("User-Agent")) || !StringUtils.isBlank(mobile)) {
if (CheckMobile.check(request.getHeader("User-Agent")) || StringUtils.isNotBlank(mobile)) {
view = request(super.createRequestPageTempletResponse("/apps/im/chatbot/mobile")); //智能机器人 移动端
}
} else {
if (CheckMobile.check(request.getHeader("User-Agent")) || !StringUtils.isBlank(mobile)) {
if (CheckMobile.check(request.getHeader("User-Agent")) || StringUtils.isNotBlank(mobile)) {
view = request(super.createRequestPageTempletResponse("/apps/im/mobile")); //WebIM移动端再次点选技能组
}
}
@ -523,13 +523,16 @@ public class IMController extends Handler {
private Contacts processContacts(String orgi, Contacts contacts, String appid, String userid) {
if (contacts != null) {
if (contacts != null && (!StringUtils.isBlank(contacts.getName()) || !StringUtils.isBlank(contacts.getPhone()) || !StringUtils.isBlank(contacts.getEmail()))) {
if (contacts != null &&
(StringUtils.isNotBlank(contacts.getName()) ||
StringUtils.isNotBlank(contacts.getPhone()) ||
StringUtils.isNotBlank(contacts.getEmail()))) {
StringBuffer query = new StringBuffer();
query.append(contacts.getName());
if (!StringUtils.isBlank(contacts.getPhone())) {
if (StringUtils.isNotBlank(contacts.getPhone())) {
query.append(" OR ").append(contacts.getPhone());
}
if (!StringUtils.isBlank(contacts.getEmail())) {
if (StringUtils.isNotBlank(contacts.getEmail())) {
query.append(" OR ").append(contacts.getEmail());
}
Page<Contacts> contactsList = contactsRes.findByOrgi(orgi, false, query.toString(), new PageRequest(0, 1));
@ -542,7 +545,7 @@ public class IMController extends Handler {
} else {
contacts.setId(null);
}
if (contacts != null && !StringUtils.isBlank(contacts.getId())) {
if (contacts != null && StringUtils.isNotBlank(contacts.getId())) {
List<AgentUserContacts> agentUserContactsList = agentUserContactsRes.findByUseridAndOrgi(userid, orgi);
if (agentUserContactsList.size() == 0) {
AgentUserContacts agentUserContacts = new AgentUserContacts();
@ -554,7 +557,7 @@ public class IMController extends Handler {
agentUserContacts.setCreatetime(new Date());
agentUserContactsRes.save(agentUserContacts);
}
} else if (!StringUtils.isBlank(userid)) {
} else if (StringUtils.isNotBlank(userid)) {
List<AgentUserContacts> agentUserContactsList = agentUserContactsRes.findByUseridAndOrgi(userid, orgi);
if (agentUserContactsList.size() > 0) {
AgentUserContacts agentUserContacts = agentUserContactsList.get(0);
@ -578,10 +581,10 @@ public class IMController extends Handler {
view.addObject("ip", UKTools.md5(request.getRemoteAddr()));
if (!StringUtils.isBlank(skill)) {
if (StringUtils.isNotBlank(skill)) {
view.addObject("skill", skill);
}
if (!StringUtils.isBlank(agent)) {
if (StringUtils.isNotBlank(agent)) {
view.addObject("agent", agent);
}
@ -589,10 +592,10 @@ public class IMController extends Handler {
view.addObject("sessionid", request.getSession().getId());
view.addObject("id", id);
if (!StringUtils.isBlank(ai)) {
if (StringUtils.isNotBlank(ai)) {
view.addObject("ai", ai);
}
if (!StringUtils.isBlank(exchange)) {
if (StringUtils.isNotBlank(exchange)) {
view.addObject("exchange", exchange);
}
@ -608,13 +611,13 @@ public class IMController extends Handler {
view.addObject("purl", purl);
if (!StringUtils.isBlank(traceid)) {
if (StringUtils.isNotBlank(traceid)) {
view.addObject("traceid", traceid);
}
if (!StringUtils.isBlank(title)) {
if (StringUtils.isNotBlank(title)) {
view.addObject("title", title);
}
if (!StringUtils.isBlank(traceid)) {
if (StringUtils.isNotBlank(traceid)) {
view.addObject("url", url);
}
CousultInvite invite = OnlineUserUtils.cousult(appid, orgi, inviteRepository);
@ -623,9 +626,9 @@ public class IMController extends Handler {
view.addObject("orgi", invite.getOrgi());
view.addObject("appid", appid);
if (!StringUtils.isBlank(aiid)) {
if (StringUtils.isNotBlank(aiid)) {
view.addObject("aiid", aiid);
} else if (!StringUtils.isBlank(invite.getAiid())) {
} else if (StringUtils.isNotBlank(invite.getAiid())) {
view.addObject("aiid", invite.getAiid());
}
}
@ -637,7 +640,7 @@ public class IMController extends Handler {
@RequestMapping("/leavemsg/save")
@Menu(type = "admin", subtype = "user")
public ModelAndView leavemsgsave(HttpServletRequest request, @Valid String appid, @Valid LeaveMsg msg) {
if (!StringUtils.isBlank(appid)) {
if (StringUtils.isNotBlank(appid)) {
SNSAccount snsAccount = snsAccountRepository.findBySnsid(appid);
String orgi = snsAccount.getOrgi();
CousultInvite invite = inviteRepository.findBySnsaccountidAndOrgi(appid, orgi);
@ -671,10 +674,10 @@ public class IMController extends Handler {
@RequestMapping("/satis")
@Menu(type = "im", subtype = "satis", access = true)
public void satis(HttpServletRequest request, HttpServletResponse response, @Valid AgentServiceSatis satis) throws Exception {
if (satis != null && !StringUtils.isBlank(satis.getId())) {
if (satis != null && StringUtils.isNotBlank(satis.getId())) {
int count = agentServiceSatisRes.countById(satis.getId());
if (count == 1) {
if (!StringUtils.isBlank(satis.getSatiscomment()) && satis.getSatiscomment().length() > 255) {
if (StringUtils.isNotBlank(satis.getSatiscomment()) && satis.getSatiscomment().length() > 255) {
satis.setSatiscomment(satis.getSatiscomment().substring(0, 255));
}
satis.setSatisfaction(true);
@ -691,7 +694,7 @@ public class IMController extends Handler {
ModelAndView view = request(super.createRequestPageTempletResponse("/apps/im/upload"));
UploadStatus upload = null;
String fileName = null;
if (imgFile != null && imgFile.getOriginalFilename().lastIndexOf(".") > 0 && !StringUtils.isBlank(userid)) {
if (imgFile != null && imgFile.getOriginalFilename().lastIndexOf(".") > 0 && StringUtils.isNotBlank(userid)) {
File uploadDir = new File(path, "upload");
if (!uploadDir.exists()) {
uploadDir.mkdirs();
@ -714,7 +717,7 @@ public class IMController extends Handler {
image = "/res/image.html?id=" + thumbnailsFileName;
}
if (paste == null) {
if (!StringUtils.isBlank(channel)) {
if (StringUtils.isNotBlank(channel)) {
MessageUtils.uploadImage(image, fileid, (int) imgFile.getSize(), imgFile.getName(), channel, userid, username, appid, orgi);
} else {
MessageUtils.uploadImage(image, fileid, (int) imgFile.getSize(), imgFile.getName(), userid);
@ -732,7 +735,7 @@ public class IMController extends Handler {
file = "/res/file.html?id=" + id;
}
File tempFile = new File(imgFile.getOriginalFilename());
if (!StringUtils.isBlank(channel)) {
if (StringUtils.isNotBlank(channel)) {
MessageUtils.uploadFile(file, (int) imgFile.getSize(), tempFile.getName(), channel, userid, username, appid, orgi, id);
} else {
MessageUtils.uploadFile(file, (int) imgFile.getSize(), tempFile.getName(), userid, id);
@ -749,7 +752,7 @@ public class IMController extends Handler {
String id = null;
if (file.getSize() > 0) { //文件尺寸 限制 启动 配置中 设置 的最大值其他地方不做限制
String fileid = UKTools.md5(file.getBytes()); //使用 文件的 MD5作为 ID避免重复上传大文件
if (!StringUtils.isBlank(fileid)) {
if (StringUtils.isNotBlank(fileid)) {
AttachmentFile attachmentFile = new AttachmentFile();
attachmentFile.setCreater(super.getUser(request).getId());
attachmentFile.setOrgi(super.getOrgi(request));
@ -767,7 +770,7 @@ public class IMController extends Handler {
} else {
attachmentFile.setTitle(uploadFile.getName());
}
if (!StringUtils.isBlank(attachmentFile.getFiletype()) && attachmentFile.getFiletype().indexOf("image") >= 0) {
if (StringUtils.isNotBlank(attachmentFile.getFiletype()) && attachmentFile.getFiletype().indexOf("image") >= 0) {
attachmentFile.setImage(true);
}
attachmentFile.setFileid(fileid);

View File

@ -264,14 +264,14 @@
<img src="<#if inviteData?? && inviteData.consult_dialog_logo??>/res/image.html?id=${inviteData.consult_dialog_logo?url}<#else>/images/logo.png</#if>" style="height:30px;padding:10px;">
<div class="ukefu-func-tab">
<ul>
<#if models?? && models["xiaoe"]?? && models["xiaoe"] == true && inviteData.ai && aiid??>
<#if models?? && models["chatbot"]?? && models["chatbot"] == true && inviteData.ai && aiid??>
<#if !exchange?? || exchange == "true">
<li><a href="/im/index.html?appid=${appid!''}&orgi=${orgi!''}<#if aiid??>&aiid=${aiid}</#if>&ai=true<#if client??>&client=${client!''}</#if><#if type??>&type=text</#if><#if skill??>&skill=${skill!''}</#if><#if agent??>&agent=${agent!''}</#if><#if title??>&title=${title?url}</#if><#if url??>&url=${url?url}</#if><#if traceid??>&traceid=${traceid}</#if>&userid=${userid!''}&sessionid=${sessionid!''}&t=${.now?long}">智能客服</a></li>
</#if>
<li class="cur"><a href="javascript:void(0)">人工坐席</a></li>
<li><a href="/im/index.html?appid=${appid!''}&orgi=${orgi!''}&ai=false<#if client??>&client=${client!''}</#if><#if type??>&type=text</#if><#if skill??>&skill=${skill!''}</#if><#if agent??>&agent=${agent!''}</#if><#if title??>&title=${title?url}</#if><#if url??>&url=${url?url}</#if><#if traceid??>&traceid=${traceid}</#if>&userid=${userid!''}&sessionid=${sessionid!''}&t=${.now?long}">人工坐席</a></li>
</#if>
<li class="cur"><a href="javascript:void(0)">智能坐席</a></li>
<#else>
<li class="cur"><a href="javascript:void(0)">人工坐席</a></li>
</#if>
<li class="cur"><a href="javascript:void(0)">智能坐席</a></li>
</#if>
</ul>
</div>
</div>

View File

@ -264,7 +264,7 @@
<img src="<#if inviteData?? && inviteData.consult_dialog_logo??>/res/image.html?id=${inviteData.consult_dialog_logo?url}<#else>/images/logo.png</#if>" style="height:30px;padding:10px;">
<div class="ukefu-func-tab">
<ul>
<#if models?? && models["xiaoe"]?? && models["xiaoe"] == true && inviteData.ai && aiid??>
<#if models?? && models["chatbot"]?? && models["chatbot"] == true && inviteData.ai && aiid??>
<#if !exchange?? || exchange == "true">
<li><a href="/im/index.html?appid=${appid!''}&orgi=${orgi!''}<#if aiid??>&aiid=${aiid}</#if>&ai=true<#if client??>&client=${client!''}</#if><#if type??>&type=text</#if><#if skill??>&skill=${skill!''}</#if><#if agent??>&agent=${agent!''}</#if><#if title??>&title=${title?url}</#if><#if url??>&url=${url?url}</#if><#if traceid??>&traceid=${traceid}</#if>&userid=${userid!''}&sessionid=${sessionid!''}&t=${.now?long}">智能客服</a></li>
</#if>

View File

@ -1,6 +1,6 @@
{
"info": {
"_postman_id": "845f31e9-eedd-4168-b2d7-f56e7ff40f58",
"_postman_id": "fa86aeb9-fcf2-4843-ab4c-c97132a46f8f",
"name": "Chatopera_cc_v1",
"description": "Chatopera Contact Center API",
"schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
@ -58,7 +58,10 @@
"value": "{{AUTH}}"
}
],
"body": {},
"body": {
"mode": "raw",
"raw": ""
},
"url": {
"raw": "http://{{IP}}:{{PORT}}/api/user",
"protocol": "http",
@ -533,7 +536,7 @@
"header": [
{
"key": "authorization",
"value": "b641622ea4c54f1e9e45520e7fed266b"
"value": "{{AUTH}}"
},
{
"key": "Content-Type",
@ -542,7 +545,7 @@
],
"body": {
"mode": "raw",
"raw": "{\n \"ops\": \"create\",\n \"primaryLanguage\": \"zh_CN\",\n \"snsid\": \"104eac\",\n \"name\": \"小C\",\n \"baseUrl\": \"http://lhc-dev:8003\",\n \"description\": \"描述\",\n \"fallback\": \"我不理解。\",\n \"welcome\": \"你好\",\n \"workmode\": \"客服机器人优先\"\n}"
"raw": "{\n \"ops\": \"create\",\n \"primaryLanguage\": \"zh_CN\",\n \"snsid\": \"104eac\",\n \"name\": \"小C\",\n \"baseUrl\": \"http://lhc-dev:8003\",\n \"description\": \"描述\",\n \"fallback\": \"我不理解。\",\n \"welcome\": \"你好\",\n \"workmode\": \"机器人客服优先\"\n}"
},
"url": {
"raw": "http://{{IP}}:{{PORT}}/api/chatbot",
@ -566,7 +569,7 @@
"header": [
{
"key": "authorization",
"value": "869c0e6dfd44421cabea7934d6fde218"
"value": "{{AUTH}}"
},
{
"key": "Content-Type",
@ -624,6 +627,105 @@
}
},
"response": []
},
{
"name": "机器人客服:删除",
"request": {
"method": "POST",
"header": [
{
"key": "authorization",
"value": "{{AUTH}}"
},
{
"key": "Content-Type",
"value": "application/json"
}
],
"body": {
"mode": "raw",
"raw": "{\n \"ops\": \"delete\",\n \"id\": \"fdf372d7ffb0456f8bd7fdfc1a054beb\"\n}"
},
"url": {
"raw": "http://{{IP}}:{{PORT}}/api/chatbot",
"protocol": "http",
"host": [
"{{IP}}"
],
"port": "{{PORT}}",
"path": [
"api",
"chatbot"
]
}
},
"response": []
},
{
"name": "机器人客服:启用",
"request": {
"method": "POST",
"header": [
{
"key": "authorization",
"value": "{{AUTH}}"
},
{
"key": "Content-Type",
"value": "application/json"
}
],
"body": {
"mode": "raw",
"raw": "{\n \"ops\": \"enable\",\n \"id\": \"eb53580ddbe3473bb112ade4eeeb3b45\"\n}"
},
"url": {
"raw": "http://{{IP}}:{{PORT}}/api/chatbot",
"protocol": "http",
"host": [
"{{IP}}"
],
"port": "{{PORT}}",
"path": [
"api",
"chatbot"
]
}
},
"response": []
},
{
"name": "机器人客服:禁用",
"request": {
"method": "POST",
"header": [
{
"key": "authorization",
"value": "{{AUTH}}"
},
{
"key": "Content-Type",
"value": "application/json"
}
],
"body": {
"mode": "raw",
"raw": "{\n \"ops\": \"disable\",\n \"id\": \"eb53580ddbe3473bb112ade4eeeb3b45\"\n}"
},
"url": {
"raw": "http://{{IP}}:{{PORT}}/api/chatbot",
"protocol": "http",
"host": [
"{{IP}}"
],
"port": "{{PORT}}",
"path": [
"api",
"chatbot"
]
}
},
"response": []
}
],
"event": [