From 1891891e4ad069185b50a769d6fd433b271c7e5b Mon Sep 17 00:00:00 2001 From: Hai Liang Wang Date: Tue, 11 Sep 2018 22:12:09 +0800 Subject: [PATCH] #75 enable chatbox for chatbot in client HTML Pages --- .../com/chatopera/cc/core/UKDataContext.java | 4 +- .../cc/webim/util/OnlineUserUtils.java | 2210 ++++++++--------- .../cc/webim/util/chatbot/ChatbotUtils.java | 2 +- .../util/server/handler/AiIMEventHandler.java | 200 -- .../api/rest/ApiChatbotController.java | 5 +- .../handler/apps/internet/IMController.java | 113 +- .../templates/apps/im/chatbot/index.html | 12 +- .../resources/templates/apps/im/index.html | 2 +- .../Chatopera_cc_v1.postman_collection.json | 112 +- 9 files changed, 1272 insertions(+), 1388 deletions(-) delete mode 100644 contact-center/app/src/main/java/com/chatopera/cc/webim/util/server/handler/AiIMEventHandler.java diff --git a/contact-center/app/src/main/java/com/chatopera/cc/core/UKDataContext.java b/contact-center/app/src/main/java/com/chatopera/cc/core/UKDataContext.java index 5394f5f5..6df22979 100644 --- a/contact-center/app/src/main/java/com/chatopera/cc/core/UKDataContext.java +++ b/contact-center/app/src/main/java/com/chatopera/cc/core/UKDataContext.java @@ -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; 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 241a8a2a..fabc4421 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 @@ -16,734 +16,707 @@ */ package com.chatopera.cc.webim.util; -import java.io.IOException; -import java.io.UnsupportedEncodingException; -import java.net.MalformedURLException; -import java.net.URL; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import javax.servlet.http.Cookie; -import javax.servlet.http.HttpServletRequest; - -import com.chatopera.cc.util.CheckMobile; +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; +import com.chatopera.cc.webim.service.impl.AgentUserService; +import com.chatopera.cc.webim.service.repository.*; +import com.chatopera.cc.webim.util.router.RouterHelper; import com.chatopera.cc.webim.util.server.message.NewRequestMessage; import com.chatopera.cc.webim.util.server.message.OtherMessageItem; +import com.chatopera.cc.webim.web.model.*; +import com.fasterxml.jackson.databind.JavaType; +import com.fasterxml.jackson.databind.ObjectMapper; +import freemarker.template.TemplateException; import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; -import com.fasterxml.jackson.databind.JavaType; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.chatopera.cc.core.UKDataContext; -import com.chatopera.cc.util.BrowserClient; -import com.chatopera.cc.util.IP; -import com.chatopera.cc.util.IPTools; -import com.chatopera.cc.util.UKTools; -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.impl.AgentUserService; -import com.chatopera.cc.webim.service.repository.ConsultInviteRepository; -import com.chatopera.cc.webim.service.repository.OnlineUserHisRepository; -import com.chatopera.cc.webim.service.repository.OnlineUserRepository; -import com.chatopera.cc.webim.service.repository.OrganRepository; -import com.chatopera.cc.webim.service.repository.OrgiSkillRelRepository; -import com.chatopera.cc.webim.service.repository.TenantRepository; -import com.chatopera.cc.webim.service.repository.UserRepository; -import com.chatopera.cc.webim.util.router.RouterHelper; -import com.chatopera.cc.webim.web.model.AgentReport; -import com.chatopera.cc.webim.web.model.AgentUser; -import com.chatopera.cc.webim.web.model.AiConfig; -import com.chatopera.cc.webim.web.model.AreaType; -import com.chatopera.cc.webim.web.model.Contacts; -import com.chatopera.cc.webim.web.model.CousultInvite; -import com.chatopera.cc.webim.web.model.KnowledgeType; -import com.chatopera.cc.webim.web.model.MessageDataBean; -import com.chatopera.cc.webim.web.model.MessageInContent; -import com.chatopera.cc.webim.web.model.OnlineUser; -import com.chatopera.cc.webim.web.model.OnlineUserHis; -import com.chatopera.cc.webim.web.model.Organ; -import com.chatopera.cc.webim.web.model.OrgiSkillRel; -import com.chatopera.cc.webim.web.model.SceneType; -import com.chatopera.cc.webim.web.model.SessionConfig; -import com.chatopera.cc.webim.web.model.SystemConfig; -import com.chatopera.cc.webim.web.model.Template; -import com.chatopera.cc.webim.web.model.Tenant; -import com.chatopera.cc.webim.web.model.Topic; -import com.chatopera.cc.webim.web.model.User; -import com.chatopera.cc.webim.web.model.UserTraceHistory; - -import freemarker.template.TemplateException; +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletRequest; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.MalformedURLException; +import java.net.URL; +import java.text.SimpleDateFormat; +import java.util.*; public class OnlineUserUtils { private final static Logger logger = LoggerFactory.getLogger(OnlineUserUtils.class); - public static WebSseEmitterClient webIMClients = new WebSseEmitterClient(); - public static ObjectMapper objectMapper = new ObjectMapper(); - /** - * - * @param user - * @param orgi - * @param id - * @param service - * @return - * @throws Exception - */ - public static OnlineUser user(User user, - String orgi, String id, OnlineUserRepository service) - throws Exception { - List onlineUserList = service.findByUseridAndOrgi(id , orgi); - return onlineUserList.size() > 0 ? onlineUserList.get(0) : null; - } - - /** - * - * @param user - * @param orgi - * @param id - * @param service - * @return - * @throws Exception - */ - public static CousultInvite cousult(String id ,String orgi, ConsultInviteRepository consultRes){ - CousultInvite consultInvite = (CousultInvite) CacheHelper.getSystemCacheBean().getCacheObject(id, orgi) ; - if(consultInvite == null){ - logger.info("CousultInvite {}", id); - if(consultRes == null){ - logger.info("NULL consultRes!!!!"); - } - - List consultInviteList = consultRes.findBySnsaccountid(id) ; - if(consultInviteList.size() > 0){ - consultInvite = consultInviteList.get(0) ; - CacheHelper.getSystemCacheBean().put(id ,consultInvite , orgi) ; - } - } - return consultInvite; - } - - - /** - * 在Cache中查询OnlineUser,或者从数据库中根据UserId,Orgi和Invite查询 - * @param user - * @param orgi - * @param id - * @param service - * @return - * @throws Exception - */ - public static OnlineUser onlineuser(String userid ,String orgi , CousultInvite invite){ - OnlineUser onlineUser = (OnlineUser) CacheHelper.getOnlineUserCacheBean().getCacheObject(userid, orgi) ; - if(onlineUser == null && invite != null && invite.isTraceuser()){ - OnlineUserRepository service = (OnlineUserRepository) UKDataContext.getContext().getBean(OnlineUserRepository.class); - - List tempOnlineUserList = service.findByUseridAndOrgi(userid , orgi); - if(tempOnlineUserList.size() > 0){ - onlineUser = tempOnlineUserList.get(0) ; - } - } - return onlineUser; - } - - - /** - * - * @param user - * @param orgi - * @param id - * @param service - * @param isJudgeShare 是否判断是否共享租户 - * @return - * @throws Exception - */ - @SuppressWarnings("unchecked") - public static List organ(String orgi , IP ipdata , CousultInvite invite,boolean isJudgeShare){ - String origOrig = orgi; - boolean isShare = false; - if(isJudgeShare) { - SystemConfig systemConfig = UKTools.getSystemConfig(); - if(systemConfig!=null&&systemConfig.isEnabletneant()&&systemConfig.isTenantshare()) { - orgi = UKDataContext.SYSTEM_ORGI; - isShare =true; - } - } - List skillList = (List) CacheHelper.getSystemCacheBean().getCacheObject(UKDataContext.CACHE_SKILL+origOrig, origOrig) ; - if(skillList == null){ - OrganRepository service = (OrganRepository) UKDataContext.getContext().getBean(OrganRepository.class); - skillList = service.findByOrgiAndSkill(orgi, true) ; - //租户共享时 查出该租住要显的绑定的技能组 - if(isShare&&!invite.getOrgi().equals(UKDataContext.SYSTEM_ORGI)) { - OrgiSkillRelRepository orgiSkillRelService = (OrgiSkillRelRepository) UKDataContext.getContext().getBean(OrgiSkillRelRepository.class); - List orgiSkillRelList = null; - orgiSkillRelList = orgiSkillRelService.findByOrgi(invite.getOrgi()) ; - List skillTempList = new ArrayList<>(); - if(!orgiSkillRelList.isEmpty()) { - for(Organ organ:skillList) { - for(OrgiSkillRel rel:orgiSkillRelList) { - if(organ.getId().equals(rel.getSkillid())) { - skillTempList.add(organ); - } - } - } - } - skillList = skillTempList; - } - - if(skillList.size() > 0){ - CacheHelper.getSystemCacheBean().put(UKDataContext.CACHE_SKILL+origOrig, skillList, origOrig); - } - } - List regOrganList = new ArrayList() ; - for(Organ organ : skillList){ - if(StringUtils.isNotBlank(organ.getArea())) { - if(organ.getArea().indexOf(ipdata.getProvince()) >= 0 || organ.getArea().indexOf(ipdata.getCity()) >= 0 ){ - regOrganList.add(organ) ; - } - }else{ - regOrganList.add(organ) ; - } - } - return regOrganList; - } - - /** - * - * @param user - * @param orgi - * @param id - * @param service - * @return - * @throws Exception - */ - @SuppressWarnings("unchecked") - public static List organ(String orgi,boolean isJudgeShare){ - String origOrig = orgi; - boolean isShare = false; - if(isJudgeShare) { - SystemConfig systemConfig = UKTools.getSystemConfig(); - if(systemConfig!=null&&systemConfig.isEnabletneant()&&systemConfig.isTenantshare()) { - orgi = UKDataContext.SYSTEM_ORGI; - isShare =true; - } - } - List skillList = (List) CacheHelper.getSystemCacheBean().getCacheObject(UKDataContext.CACHE_SKILL+origOrig, origOrig) ; - if(skillList == null){ - OrganRepository service = (OrganRepository) UKDataContext.getContext().getBean(OrganRepository.class); - skillList = service.findByOrgiAndSkill(orgi, true) ; - //租户共享时 查出该租住要显的绑定的技能组 - if(isShare&&!origOrig.equals(UKDataContext.SYSTEM_ORGI)) { - OrgiSkillRelRepository orgiSkillRelService = (OrgiSkillRelRepository) UKDataContext.getContext().getBean(OrgiSkillRelRepository.class); - List orgiSkillRelList = null; - orgiSkillRelList = orgiSkillRelService.findByOrgi(origOrig) ; - List skillTempList = new ArrayList<>(); - if(!orgiSkillRelList.isEmpty()) { - for(Organ organ:skillList) { - for(OrgiSkillRel rel:orgiSkillRelList) { - if(organ.getId().equals(rel.getSkillid())) { - skillTempList.add(organ); - } - } - } - } - skillList = skillTempList; - } - if(skillList.size() > 0){ - CacheHelper.getSystemCacheBean().put(UKDataContext.CACHE_SKILL+origOrig, skillList, origOrig); - } - - } - return skillList; - } - - private static List getAreaTypeList(String area , List areaTypeList){ - List atList = new ArrayList() ; - if(areaTypeList!=null && areaTypeList.size() > 0){ - for(AreaType areaType : areaTypeList){ - if(!StringUtils.isBlank(area) && area.indexOf(areaType.getId()) >= 0){ - atList.add(areaType) ; - } - } - } - return atList; - } - /** - * 只要有一级 地区命中就就返回 - * @param orgi - * @param ipdata - * @param topicTypeList - * @return - */ - public static List topicType(String orgi , IP ipdata , List topicTypeList){ - List tempTopicTypeList = new ArrayList(); - for(KnowledgeType topicType : topicTypeList){ - if(getParentArea(ipdata, topicType, topicTypeList) != null){ - tempTopicTypeList.add(topicType) ; - } - } - return tempTopicTypeList ; - } - /** - * - * @param topicType - * @param topicTypeList - * @return - */ - private static KnowledgeType getParentArea(IP ipdata , KnowledgeType topicType , List topicTypeList){ - KnowledgeType area = null ; - if(!StringUtils.isBlank(topicType.getArea())){ - if((topicType.getArea().indexOf(ipdata.getProvince()) >=0 || topicType.getArea().indexOf(ipdata.getCity()) >= 0)){ - area = topicType; - } - }else{ - if(!StringUtils.isBlank(topicType.getParentid()) && !topicType.getParentid().equals("0")){ - for(KnowledgeType temp : topicTypeList){ - if(temp.getId().equals(topicType.getParentid())){ - if(!StringUtils.isBlank(temp.getArea())){ - if((temp.getArea().indexOf(ipdata.getProvince()) >=0 || temp.getArea().indexOf(ipdata.getCity()) >= 0)){ - area = temp ; break ; - }else{ - break ; - } - }else{ - area = getParentArea(ipdata , temp, topicTypeList) ; - } - } - } - }else{ - area = topicType ; - } - } - return area ; - } - - public static List topic(String orgi , List topicTypeList , List topicList){ - List tempTopicList = new ArrayList(); - if(topicList!=null){ - for(Topic topic : topicList){ - if(StringUtils.isBlank(topic.getCate()) || UKDataContext.DEFAULT_TYPE.equals(topic.getCate()) || getTopicType(topic.getCate(), topicTypeList)!=null){ - tempTopicList.add(topic) ; - } - } - } - return tempTopicList; - } - /** - * 根据热点知识找到 非空的 分类 - * @param topicTypeList - * @param topicList - * @return - */ - public static List filterTopicType(List topicTypeList , List topicList){ - List tempTopicTypeList = new ArrayList(); - if(topicTypeList!=null){ - for(KnowledgeType knowledgeType : topicTypeList){ - boolean hasTopic = false ; - for(Topic topic : topicList){ - if(knowledgeType.getId().equals(topic.getCate())){ - hasTopic = true ; break ; - } - } - if(hasTopic){ - tempTopicTypeList.add(knowledgeType) ; - } - } - } - return tempTopicTypeList ; - } - - /** - * 找到知识点对应的 分类 - * @param cate - * @param topicTypeList - * @return - */ - private static KnowledgeType getTopicType(String cate , List topicTypeList){ - KnowledgeType kt = null ; - for(KnowledgeType knowledgeType : topicTypeList){ - if(knowledgeType.getId().equals(cate)){ - kt = knowledgeType ; break ; - } - } - return kt ; - } - /** - * - * @param user - * @param orgi - * @param id - * @param service - * @return - * @throws Exception - */ - @SuppressWarnings("unchecked") - public static List agents(String orgi,boolean isJudgeShare){ - String origOrig = orgi; - boolean isShare = false; - if(isJudgeShare) { - SystemConfig systemConfig = UKTools.getSystemConfig(); - if(systemConfig!=null&&systemConfig.isEnabletneant()&&systemConfig.isTenantshare()) { - orgi = UKDataContext.SYSTEM_ORGI; - isShare = true; - } - } - List agentList = (List) CacheHelper.getSystemCacheBean().getCacheObject(UKDataContext.CACHE_AGENT+origOrig, origOrig) ; - List agentTempList = null; - if(agentList == null){ - UserRepository service = (UserRepository) UKDataContext.getContext().getBean(UserRepository.class); - agentList = service.findByOrgiAndAgentAndDatastatus(orgi, true,false) ; - agentTempList = new ArrayList(); - //共享的话 查出绑定的组织 - if(isShare) { - OrgiSkillRelRepository orgiSkillRelService = (OrgiSkillRelRepository) UKDataContext.getContext().getBean(OrgiSkillRelRepository.class); - List orgiSkillRelList = orgiSkillRelService.findByOrgi(origOrig) ; - if(!orgiSkillRelList.isEmpty()) { - for(User user:agentList) { - for(OrgiSkillRel rel:orgiSkillRelList) { - if(user.getOrgan()!=null && user.getOrgan().equals(rel.getSkillid())) { - agentTempList.add(user); - } - } - } - } - agentList = agentTempList; - } - if(agentList.size() > 0){ - CacheHelper.getSystemCacheBean().put(UKDataContext.CACHE_AGENT+origOrig, agentList, origOrig); - } - } - return agentList; - } - - - public static void clean(String orgi){ - //共享 查出机构下所有产品 - SystemConfig systemConfig = UKTools.getSystemConfig(); - if(systemConfig!=null&&systemConfig.isEnabletneant()&&systemConfig.isTenantshare()) { - TenantRepository tenantRes = UKDataContext.getContext().getBean(TenantRepository.class) ; - Tenant tenant = tenantRes.findById(orgi); - if(tenant!=null) { - List tenantList = tenantRes.findByOrgid(tenant.getOrgid()); - if(!tenantList.isEmpty()) { - for(Tenant t:tenantList) { - String orgiT = t.getId(); - CacheHelper.getSystemCacheBean().delete(UKDataContext.CACHE_SKILL+orgiT, orgiT) ; - CacheHelper.getSystemCacheBean().delete(UKDataContext.CACHE_AGENT+orgiT, orgiT) ; - } - } - } - }else { - CacheHelper.getSystemCacheBean().delete(UKDataContext.CACHE_SKILL+orgi, orgi) ; - CacheHelper.getSystemCacheBean().delete(UKDataContext.CACHE_AGENT+orgi, orgi) ; - } - } - /** - * - * @param user - * @param orgi - * @param id - * @param service - * @return - * @throws Exception - */ - public static void cacheOnlineUser(OnlineUser onlineUser ,String orgi , CousultInvite invite){ - if(onlineUser!=null && !StringUtils.isBlank(onlineUser.getUserid())){ - CacheHelper.getOnlineUserCacheBean().put(onlineUser.getUserid() , onlineUser , orgi) ; - } - if(invite.isTraceuser()){ - UKTools.published(onlineUser); - } - } - - /** - * - * @param user - * @param orgi - * @param optype - * @param request - * @param service - * @throws Exception - */ - public static OnlineUser online(User user, String orgi, String sessionid,String optype, HttpServletRequest request , String channel , String appid , Contacts contacts , CousultInvite invite) { - OnlineUser onlineUser = null; - if (UKDataContext.getContext() != null && invite != null) { - onlineUser = onlineuser(user.getId(), orgi , invite) ; - if (onlineUser == null) { - onlineUser = new OnlineUser(); - onlineUser.setId(user.getId()); - onlineUser.setCreater(user.getId()); - onlineUser.setUsername(user.getUsername()); - onlineUser.setCreatetime(new Date()); - onlineUser.setUpdatetime(new Date()); - onlineUser.setUpdateuser(user.getUsername()); - onlineUser.setSessionid(sessionid); - - if(contacts!=null){ - onlineUser.setContactsid(contacts.getId()); - } - - onlineUser.setOrgi(orgi); - onlineUser.setChannel(channel); - - String cookie = getCookie(request, "R3GUESTUSEKEY"); - if ((StringUtils.isBlank(cookie)) - || (user.getSessionid().equals(cookie))) { - onlineUser.setOlduser("0"); - } else { - onlineUser.setOlduser("1"); - } - onlineUser.setMobile(CheckMobile.check(request - .getHeader("User-Agent")) ? "1" : "0"); - - // onlineUser.setSource(user.getId()); - - String url = request.getHeader("referer"); - onlineUser.setUrl(url); - if (!StringUtils.isBlank(url)) { - try { - URL referer = new URL(url); - onlineUser.setSource(referer.getHost()); - } catch (MalformedURLException e) { - e.printStackTrace(); - } - } - onlineUser.setAppid(appid); - onlineUser.setUserid(user.getId()); - onlineUser.setUsername(user.getUsername()); - - if(!StringUtils.isBlank(request.getParameter("title"))){ - String title = request.getParameter("title") ; - if(title.length() > 255){ - onlineUser.setTitle(title.substring(0,255)); - }else{ - onlineUser.setTitle(title); - } - } - - String ip = UKTools.getIpAddr(request); - - onlineUser.setLogintime(new Date()); - onlineUser.setIp(ip); - - IP ipdata = IPTools.getInstance().findGeography(ip); - onlineUser.setCountry(ipdata.getCountry()); - onlineUser.setProvince(ipdata.getProvince()); - onlineUser.setCity(ipdata.getCity()); - onlineUser.setIsp(ipdata.getIsp()); - onlineUser.setRegion(ipdata.toString() + "(" - + ip + ")"); - - onlineUser.setDatestr(new SimpleDateFormat("yyyMMdd") - .format(new Date())); - - onlineUser.setHostname(ip); - onlineUser.setSessionid(sessionid); - onlineUser.setOptype(optype); - onlineUser - .setStatus(UKDataContext.OnlineUserOperatorStatus.ONLINE - .toString()); - BrowserClient client = UKTools.parseClient(request); - onlineUser.setOpersystem(client.getOs()); - onlineUser.setBrowser(client.getBrowser()); - onlineUser.setUseragent(client.getUseragent()); - }else{ - onlineUser.setCreatetime(new Date()); - if((!StringUtils.isBlank(onlineUser.getSessionid()) && !onlineUser.getSessionid().equals(sessionid)) || !UKDataContext.OnlineUserOperatorStatus.ONLINE.toString().equals(onlineUser.getStatus())){ - onlineUser.setStatus(UKDataContext.OnlineUserOperatorStatus.ONLINE.toString()); - onlineUser.setChannel(channel); - onlineUser.setAppid(appid); - onlineUser.setUpdatetime(new Date()); - if(!StringUtils.isBlank(onlineUser.getSessionid()) && !onlineUser.getSessionid().equals(sessionid)){ - onlineUser.setInvitestatus(UKDataContext.OnlineUserInviteStatus.DEFAULT.toString()); - onlineUser.setSessionid(sessionid); - onlineUser.setLogintime(new Date()); - onlineUser.setInvitetimes(0); - } - }else if(contacts!=null){ - if(!StringUtils.isBlank(contacts.getId()) && !StringUtils.isBlank(contacts.getName()) &&(StringUtils.isBlank(onlineUser.getContactsid()) || !contacts.getName().equals(onlineUser.getUsername()))){ - if(StringUtils.isBlank(onlineUser.getContactsid())){ - onlineUser.setContactsid(contacts.getId()); - } - if(!contacts.getName().equals(onlineUser.getUsername())){ - onlineUser.setUsername(contacts.getName()); - } - onlineUser.setUpdatetime(new Date()); - } - } - if(StringUtils.isBlank(onlineUser.getUsername()) && !StringUtils.isBlank(user.getUsername())){ - onlineUser.setUseragent(user.getUsername()); - onlineUser.setUpdatetime(new Date()); - } - } - if(invite.isRecordhis() && !StringUtils.isBlank(request.getParameter("traceid"))){ - UserTraceHistory trace = new UserTraceHistory(); - trace.setId(request.getParameter("traceid")); - trace.setTitle(request.getParameter("title")); - trace.setUrl(request.getParameter("url")); - trace.setOrgi(invite.getOrgi()); - trace.setUpdatetime(new Date()); - trace.setUsername(onlineUser.getUsername()); - - UKTools.published(trace); - } - cacheOnlineUser(onlineUser, orgi , invite); - } - return onlineUser; - } - - /** - * - * @param request - * @param key - * @return - */ - public static String getCookie(HttpServletRequest request, String key) { - Cookie data = null; - if (request != null && request.getCookies() != null) { - for (Cookie cookie : request.getCookies()) { - if (cookie.getName().equals(key)) { - data = cookie; - break; - } - } - } - return data != null ? data.getValue() : null; - } - - /** - * - * @param user - * @param orgi - * @throws Exception - */ - 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) ; - - 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); - } - } - } - CacheHelper.getOnlineUserCacheBean().delete(user, orgi) ; - } - } - - public static void offline(OnlineUser onlineUser) throws Exception { - if(UKDataContext.getContext()!=null){ - OnlineUserRepository service = UKDataContext.getContext().getBean( - OnlineUserRepository.class); - OnlineUserHisRepository onlineHisUserRes = UKDataContext.getContext().getBean(OnlineUserHisRepository.class) ; - if (onlineUser != null) { - 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()); - service.save(onlineUser) ; - CacheHelper.getOnlineUserCacheBean().delete(onlineUser.getUserid(), onlineUser.getOrgi()) ; - if(onlineUser!=null){ - List hisList = onlineHisUserRes.findBySessionidAndOrgi(onlineUser.getSessionid() , onlineUser.getOrgi()) ; - 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); - } - } - } - } - - /** - * - * @param user - * @param orgi - * @throws Exception - */ - public static void refuseInvite(String user, String orgi) { - OnlineUserRepository service = UKDataContext.getContext().getBean( - OnlineUserRepository.class); - - List onlineUserList = service.findByUseridAndOrgi(user , orgi); - if (onlineUserList.size() > 0) { - OnlineUser onlineUser = onlineUserList.get(0); - onlineUser.setInvitestatus(UKDataContext.OnlineUserInviteStatus.REFUSE.toString()); - onlineUser.setRefusetimes(onlineUser.getRefusetimes()+1); - service.save(onlineUser) ; - } - } - - public static String unescape(String src) { - StringBuffer tmp = new StringBuffer(); - try { - tmp.append(java.net.URLDecoder.decode(src, "UTF-8")); - } catch (UnsupportedEncodingException e) { - e.printStackTrace(); - } - - return tmp.toString(); - } - - public static String getKeyword(String url) { - Map values = new HashMap(); - try { - parseParameters(values, url, "UTF-8"); - } catch (UnsupportedEncodingException e) { - e.printStackTrace(); - } - StringBuffer strb = new StringBuffer(); - String[] data = values.get("q"); - if (data != null) { - for (String v : data) { - strb.append(v); - } - } - return strb.toString(); - } - - public static String getSource(String url) { - String source = "0"; - try { - URL addr = new URL(url); - source = addr.getHost(); - } catch (MalformedURLException e) { - e.printStackTrace(); - } - return source; - } + public static WebSseEmitterClient webIMClients = new WebSseEmitterClient(); + public static ObjectMapper objectMapper = new ObjectMapper(); /** + * @param user + * @param orgi + * @param id + * @param service + * @return + * @throws Exception + */ + public static OnlineUser user(User user, + String orgi, String id, OnlineUserRepository service) + throws Exception { + List onlineUserList = service.findByUseridAndOrgi(id, orgi); + return onlineUserList.size() > 0 ? onlineUserList.get(0) : null; + } + + /** + * 更新cache + * @param id + * @param cousultInvite + */ + public static void cacheCousult(final CousultInvite cousultInvite) { + CacheHelper.getSystemCacheBean().put(cousultInvite.getSnsaccountid(), cousultInvite, cousultInvite.getOrgi()); + } + + /** + * @param user + * @param orgi + * @param id + * @param service + * @return + * @throws Exception + */ + public static CousultInvite cousult(String id, String orgi, ConsultInviteRepository consultRes) { + CousultInvite consultInvite = (CousultInvite) CacheHelper.getSystemCacheBean().getCacheObject(id, orgi); + if (consultInvite == null) { + logger.info("CousultInvite {}", id); + if (consultRes == null) { + logger.info("NULL consultRes!!!!"); + } + + List consultInviteList = consultRes.findBySnsaccountid(id); + if (consultInviteList.size() > 0) { + consultInvite = consultInviteList.get(0); + CacheHelper.getSystemCacheBean().put(id, consultInvite, orgi); + } + } + return consultInvite; + } + + + /** + * 在Cache中查询OnlineUser,或者从数据库中根据UserId,Orgi和Invite查询 * + * @param user + * @param orgi + * @param id + * @param service + * @return + * @throws Exception + */ + public static OnlineUser onlineuser(String userid, String orgi, CousultInvite invite) { + OnlineUser onlineUser = (OnlineUser) CacheHelper.getOnlineUserCacheBean().getCacheObject(userid, orgi); + if (onlineUser == null && invite != null && invite.isTraceuser()) { + OnlineUserRepository service = (OnlineUserRepository) UKDataContext.getContext().getBean(OnlineUserRepository.class); + + List tempOnlineUserList = service.findByUseridAndOrgi(userid, orgi); + if (tempOnlineUserList.size() > 0) { + onlineUser = tempOnlineUserList.get(0); + } + } + return onlineUser; + } + + + /** + * @param user + * @param orgi + * @param id + * @param service + * @param isJudgeShare 是否判断是否共享租户 + * @return + * @throws Exception + */ + @SuppressWarnings("unchecked") + public static List organ(String orgi, IP ipdata, CousultInvite invite, boolean isJudgeShare) { + String origOrig = orgi; + boolean isShare = false; + if (isJudgeShare) { + SystemConfig systemConfig = UKTools.getSystemConfig(); + if (systemConfig != null && systemConfig.isEnabletneant() && systemConfig.isTenantshare()) { + orgi = UKDataContext.SYSTEM_ORGI; + isShare = true; + } + } + List skillList = (List) CacheHelper.getSystemCacheBean().getCacheObject(UKDataContext.CACHE_SKILL + origOrig, origOrig); + if (skillList == null) { + OrganRepository service = (OrganRepository) UKDataContext.getContext().getBean(OrganRepository.class); + skillList = service.findByOrgiAndSkill(orgi, true); + //租户共享时 查出该租住要显的绑定的技能组 + if (isShare && !invite.getOrgi().equals(UKDataContext.SYSTEM_ORGI)) { + OrgiSkillRelRepository orgiSkillRelService = (OrgiSkillRelRepository) UKDataContext.getContext().getBean(OrgiSkillRelRepository.class); + List orgiSkillRelList = null; + orgiSkillRelList = orgiSkillRelService.findByOrgi(invite.getOrgi()); + List skillTempList = new ArrayList<>(); + if (!orgiSkillRelList.isEmpty()) { + for (Organ organ : skillList) { + for (OrgiSkillRel rel : orgiSkillRelList) { + if (organ.getId().equals(rel.getSkillid())) { + skillTempList.add(organ); + } + } + } + } + skillList = skillTempList; + } + + if (skillList.size() > 0) { + CacheHelper.getSystemCacheBean().put(UKDataContext.CACHE_SKILL + origOrig, skillList, origOrig); + } + } + List regOrganList = new ArrayList(); + for (Organ organ : skillList) { + if (StringUtils.isNotBlank(organ.getArea())) { + if (organ.getArea().indexOf(ipdata.getProvince()) >= 0 || organ.getArea().indexOf(ipdata.getCity()) >= 0) { + regOrganList.add(organ); + } + } else { + regOrganList.add(organ); + } + } + return regOrganList; + } + + /** + * @param user + * @param orgi + * @param id + * @param service + * @return + * @throws Exception + */ + @SuppressWarnings("unchecked") + public static List organ(String orgi, boolean isJudgeShare) { + String origOrig = orgi; + boolean isShare = false; + if (isJudgeShare) { + SystemConfig systemConfig = UKTools.getSystemConfig(); + if (systemConfig != null && systemConfig.isEnabletneant() && systemConfig.isTenantshare()) { + orgi = UKDataContext.SYSTEM_ORGI; + isShare = true; + } + } + List skillList = (List) CacheHelper.getSystemCacheBean().getCacheObject(UKDataContext.CACHE_SKILL + origOrig, origOrig); + if (skillList == null) { + OrganRepository service = (OrganRepository) UKDataContext.getContext().getBean(OrganRepository.class); + skillList = service.findByOrgiAndSkill(orgi, true); + //租户共享时 查出该租住要显的绑定的技能组 + if (isShare && !origOrig.equals(UKDataContext.SYSTEM_ORGI)) { + OrgiSkillRelRepository orgiSkillRelService = (OrgiSkillRelRepository) UKDataContext.getContext().getBean(OrgiSkillRelRepository.class); + List orgiSkillRelList = null; + orgiSkillRelList = orgiSkillRelService.findByOrgi(origOrig); + List skillTempList = new ArrayList<>(); + if (!orgiSkillRelList.isEmpty()) { + for (Organ organ : skillList) { + for (OrgiSkillRel rel : orgiSkillRelList) { + if (organ.getId().equals(rel.getSkillid())) { + skillTempList.add(organ); + } + } + } + } + skillList = skillTempList; + } + if (skillList.size() > 0) { + CacheHelper.getSystemCacheBean().put(UKDataContext.CACHE_SKILL + origOrig, skillList, origOrig); + } + + } + return skillList; + } + + private static List getAreaTypeList(String area, List areaTypeList) { + List atList = new ArrayList(); + if (areaTypeList != null && areaTypeList.size() > 0) { + for (AreaType areaType : areaTypeList) { + if (!StringUtils.isBlank(area) && area.indexOf(areaType.getId()) >= 0) { + atList.add(areaType); + } + } + } + return atList; + } + + /** + * 只要有一级 地区命中就就返回 + * + * @param orgi + * @param ipdata + * @param topicTypeList + * @return + */ + public static List topicType(String orgi, IP ipdata, List topicTypeList) { + List tempTopicTypeList = new ArrayList(); + for (KnowledgeType topicType : topicTypeList) { + if (getParentArea(ipdata, topicType, topicTypeList) != null) { + tempTopicTypeList.add(topicType); + } + } + return tempTopicTypeList; + } + + /** + * @param topicType + * @param topicTypeList + * @return + */ + private static KnowledgeType getParentArea(IP ipdata, KnowledgeType topicType, List topicTypeList) { + KnowledgeType area = null; + if (!StringUtils.isBlank(topicType.getArea())) { + if ((topicType.getArea().indexOf(ipdata.getProvince()) >= 0 || topicType.getArea().indexOf(ipdata.getCity()) >= 0)) { + area = topicType; + } + } else { + if (!StringUtils.isBlank(topicType.getParentid()) && !topicType.getParentid().equals("0")) { + for (KnowledgeType temp : topicTypeList) { + if (temp.getId().equals(topicType.getParentid())) { + if (!StringUtils.isBlank(temp.getArea())) { + if ((temp.getArea().indexOf(ipdata.getProvince()) >= 0 || temp.getArea().indexOf(ipdata.getCity()) >= 0)) { + area = temp; + break; + } else { + break; + } + } else { + area = getParentArea(ipdata, temp, topicTypeList); + } + } + } + } else { + area = topicType; + } + } + return area; + } + + public static List topic(String orgi, List topicTypeList, List topicList) { + List tempTopicList = new ArrayList(); + if (topicList != null) { + for (Topic topic : topicList) { + if (StringUtils.isBlank(topic.getCate()) || UKDataContext.DEFAULT_TYPE.equals(topic.getCate()) || getTopicType(topic.getCate(), topicTypeList) != null) { + tempTopicList.add(topic); + } + } + } + return tempTopicList; + } + + /** + * 根据热点知识找到 非空的 分类 + * + * @param topicTypeList + * @param topicList + * @return + */ + public static List filterTopicType(List topicTypeList, List topicList) { + List tempTopicTypeList = new ArrayList(); + if (topicTypeList != null) { + for (KnowledgeType knowledgeType : topicTypeList) { + boolean hasTopic = false; + for (Topic topic : topicList) { + if (knowledgeType.getId().equals(topic.getCate())) { + hasTopic = true; + break; + } + } + if (hasTopic) { + tempTopicTypeList.add(knowledgeType); + } + } + } + return tempTopicTypeList; + } + + /** + * 找到知识点对应的 分类 + * + * @param cate + * @param topicTypeList + * @return + */ + private static KnowledgeType getTopicType(String cate, List topicTypeList) { + KnowledgeType kt = null; + for (KnowledgeType knowledgeType : topicTypeList) { + if (knowledgeType.getId().equals(cate)) { + kt = knowledgeType; + break; + } + } + return kt; + } + + /** + * @param user + * @param orgi + * @param id + * @param service + * @return + * @throws Exception + */ + @SuppressWarnings("unchecked") + public static List agents(String orgi, boolean isJudgeShare) { + String origOrig = orgi; + boolean isShare = false; + if (isJudgeShare) { + SystemConfig systemConfig = UKTools.getSystemConfig(); + if (systemConfig != null && systemConfig.isEnabletneant() && systemConfig.isTenantshare()) { + orgi = UKDataContext.SYSTEM_ORGI; + isShare = true; + } + } + List agentList = (List) CacheHelper.getSystemCacheBean().getCacheObject(UKDataContext.CACHE_AGENT + origOrig, origOrig); + List agentTempList = null; + if (agentList == null) { + UserRepository service = (UserRepository) UKDataContext.getContext().getBean(UserRepository.class); + agentList = service.findByOrgiAndAgentAndDatastatus(orgi, true, false); + agentTempList = new ArrayList(); + //共享的话 查出绑定的组织 + if (isShare) { + OrgiSkillRelRepository orgiSkillRelService = (OrgiSkillRelRepository) UKDataContext.getContext().getBean(OrgiSkillRelRepository.class); + List orgiSkillRelList = orgiSkillRelService.findByOrgi(origOrig); + if (!orgiSkillRelList.isEmpty()) { + for (User user : agentList) { + for (OrgiSkillRel rel : orgiSkillRelList) { + if (user.getOrgan() != null && user.getOrgan().equals(rel.getSkillid())) { + agentTempList.add(user); + } + } + } + } + agentList = agentTempList; + } + if (agentList.size() > 0) { + CacheHelper.getSystemCacheBean().put(UKDataContext.CACHE_AGENT + origOrig, agentList, origOrig); + } + } + return agentList; + } + + + public static void clean(String orgi) { + //共享 查出机构下所有产品 + SystemConfig systemConfig = UKTools.getSystemConfig(); + if (systemConfig != null && systemConfig.isEnabletneant() && systemConfig.isTenantshare()) { + TenantRepository tenantRes = UKDataContext.getContext().getBean(TenantRepository.class); + Tenant tenant = tenantRes.findById(orgi); + if (tenant != null) { + List tenantList = tenantRes.findByOrgid(tenant.getOrgid()); + if (!tenantList.isEmpty()) { + for (Tenant t : tenantList) { + String orgiT = t.getId(); + CacheHelper.getSystemCacheBean().delete(UKDataContext.CACHE_SKILL + orgiT, orgiT); + CacheHelper.getSystemCacheBean().delete(UKDataContext.CACHE_AGENT + orgiT, orgiT); + } + } + } + } else { + CacheHelper.getSystemCacheBean().delete(UKDataContext.CACHE_SKILL + orgi, orgi); + CacheHelper.getSystemCacheBean().delete(UKDataContext.CACHE_AGENT + orgi, orgi); + } + } + + /** + * @param user + * @param orgi + * @param id + * @param service + * @return + * @throws Exception + */ + public static void cacheOnlineUser(OnlineUser onlineUser, String orgi, CousultInvite invite) { + if (onlineUser != null && !StringUtils.isBlank(onlineUser.getUserid())) { + CacheHelper.getOnlineUserCacheBean().put(onlineUser.getUserid(), onlineUser, orgi); + } + if (invite.isTraceuser()) { + UKTools.published(onlineUser); + } + } + + /** + * @param user + * @param orgi + * @param optype + * @param request + * @param service + * @throws Exception + */ + public static OnlineUser online(User user, String orgi, String sessionid, String optype, HttpServletRequest request, String channel, String appid, Contacts contacts, CousultInvite invite) { + OnlineUser onlineUser = null; + if (UKDataContext.getContext() != null && invite != null) { + onlineUser = onlineuser(user.getId(), orgi, invite); + if (onlineUser == null) { + onlineUser = new OnlineUser(); + onlineUser.setId(user.getId()); + onlineUser.setCreater(user.getId()); + onlineUser.setUsername(user.getUsername()); + onlineUser.setCreatetime(new Date()); + onlineUser.setUpdatetime(new Date()); + onlineUser.setUpdateuser(user.getUsername()); + onlineUser.setSessionid(sessionid); + + if (contacts != null) { + onlineUser.setContactsid(contacts.getId()); + } + + onlineUser.setOrgi(orgi); + onlineUser.setChannel(channel); + + String cookie = getCookie(request, "R3GUESTUSEKEY"); + if ((StringUtils.isBlank(cookie)) + || (user.getSessionid().equals(cookie))) { + onlineUser.setOlduser("0"); + } else { + onlineUser.setOlduser("1"); + } + onlineUser.setMobile(CheckMobile.check(request + .getHeader("User-Agent")) ? "1" : "0"); + + // onlineUser.setSource(user.getId()); + + String url = request.getHeader("referer"); + onlineUser.setUrl(url); + if (!StringUtils.isBlank(url)) { + try { + URL referer = new URL(url); + onlineUser.setSource(referer.getHost()); + } catch (MalformedURLException e) { + e.printStackTrace(); + } + } + onlineUser.setAppid(appid); + onlineUser.setUserid(user.getId()); + onlineUser.setUsername(user.getUsername()); + + if (!StringUtils.isBlank(request.getParameter("title"))) { + String title = request.getParameter("title"); + if (title.length() > 255) { + onlineUser.setTitle(title.substring(0, 255)); + } else { + onlineUser.setTitle(title); + } + } + + String ip = UKTools.getIpAddr(request); + + onlineUser.setLogintime(new Date()); + onlineUser.setIp(ip); + + IP ipdata = IPTools.getInstance().findGeography(ip); + onlineUser.setCountry(ipdata.getCountry()); + onlineUser.setProvince(ipdata.getProvince()); + onlineUser.setCity(ipdata.getCity()); + onlineUser.setIsp(ipdata.getIsp()); + onlineUser.setRegion(ipdata.toString() + "(" + + ip + ")"); + + onlineUser.setDatestr(new SimpleDateFormat("yyyMMdd") + .format(new Date())); + + onlineUser.setHostname(ip); + onlineUser.setSessionid(sessionid); + onlineUser.setOptype(optype); + onlineUser + .setStatus(UKDataContext.OnlineUserOperatorStatus.ONLINE + .toString()); + BrowserClient client = UKTools.parseClient(request); + onlineUser.setOpersystem(client.getOs()); + onlineUser.setBrowser(client.getBrowser()); + onlineUser.setUseragent(client.getUseragent()); + } else { + onlineUser.setCreatetime(new Date()); + if ((!StringUtils.isBlank(onlineUser.getSessionid()) && !onlineUser.getSessionid().equals(sessionid)) || !UKDataContext.OnlineUserOperatorStatus.ONLINE.toString().equals(onlineUser.getStatus())) { + onlineUser.setStatus(UKDataContext.OnlineUserOperatorStatus.ONLINE.toString()); + onlineUser.setChannel(channel); + onlineUser.setAppid(appid); + onlineUser.setUpdatetime(new Date()); + if (!StringUtils.isBlank(onlineUser.getSessionid()) && !onlineUser.getSessionid().equals(sessionid)) { + onlineUser.setInvitestatus(UKDataContext.OnlineUserInviteStatus.DEFAULT.toString()); + onlineUser.setSessionid(sessionid); + onlineUser.setLogintime(new Date()); + onlineUser.setInvitetimes(0); + } + } else if (contacts != null) { + if (!StringUtils.isBlank(contacts.getId()) && !StringUtils.isBlank(contacts.getName()) && (StringUtils.isBlank(onlineUser.getContactsid()) || !contacts.getName().equals(onlineUser.getUsername()))) { + if (StringUtils.isBlank(onlineUser.getContactsid())) { + onlineUser.setContactsid(contacts.getId()); + } + if (!contacts.getName().equals(onlineUser.getUsername())) { + onlineUser.setUsername(contacts.getName()); + } + onlineUser.setUpdatetime(new Date()); + } + } + if (StringUtils.isBlank(onlineUser.getUsername()) && !StringUtils.isBlank(user.getUsername())) { + onlineUser.setUseragent(user.getUsername()); + onlineUser.setUpdatetime(new Date()); + } + } + if (invite.isRecordhis() && !StringUtils.isBlank(request.getParameter("traceid"))) { + UserTraceHistory trace = new UserTraceHistory(); + trace.setId(request.getParameter("traceid")); + trace.setTitle(request.getParameter("title")); + trace.setUrl(request.getParameter("url")); + trace.setOrgi(invite.getOrgi()); + trace.setUpdatetime(new Date()); + trace.setUsername(onlineUser.getUsername()); + + UKTools.published(trace); + } + cacheOnlineUser(onlineUser, orgi, invite); + } + return onlineUser; + } + + /** + * @param request + * @param key + * @return + */ + public static String getCookie(HttpServletRequest request, String key) { + Cookie data = null; + if (request != null && request.getCookies() != null) { + for (Cookie cookie : request.getCookies()) { + if (cookie.getName().equals(key)) { + data = cookie; + break; + } + } + } + return data != null ? data.getValue() : null; + } + + /** + * @param user + * @param orgi + * @throws Exception + */ + 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); + + 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); + } + } + } + CacheHelper.getOnlineUserCacheBean().delete(user, orgi); + } + } + + public static void offline(OnlineUser onlineUser) throws Exception { + if (UKDataContext.getContext() != null) { + OnlineUserRepository service = UKDataContext.getContext().getBean( + OnlineUserRepository.class); + OnlineUserHisRepository onlineHisUserRes = UKDataContext.getContext().getBean(OnlineUserHisRepository.class); + if (onlineUser != null) { + 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()); + service.save(onlineUser); + CacheHelper.getOnlineUserCacheBean().delete(onlineUser.getUserid(), onlineUser.getOrgi()); + if (onlineUser != null) { + List hisList = onlineHisUserRes.findBySessionidAndOrgi(onlineUser.getSessionid(), onlineUser.getOrgi()); + 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); + } + } + } + } + + /** + * @param user + * @param orgi + * @throws Exception + */ + public static void refuseInvite(String user, String orgi) { + OnlineUserRepository service = UKDataContext.getContext().getBean( + OnlineUserRepository.class); + + List onlineUserList = service.findByUseridAndOrgi(user, orgi); + if (onlineUserList.size() > 0) { + OnlineUser onlineUser = onlineUserList.get(0); + onlineUser.setInvitestatus(UKDataContext.OnlineUserInviteStatus.REFUSE.toString()); + onlineUser.setRefusetimes(onlineUser.getRefusetimes() + 1); + service.save(onlineUser); + } + } + + public static String unescape(String src) { + StringBuffer tmp = new StringBuffer(); + try { + tmp.append(java.net.URLDecoder.decode(src, "UTF-8")); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + + return tmp.toString(); + } + + public static String getKeyword(String url) { + Map values = new HashMap(); + try { + parseParameters(values, url, "UTF-8"); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + StringBuffer strb = new StringBuffer(); + String[] data = values.get("q"); + if (data != null) { + for (String v : data) { + strb.append(v); + } + } + return strb.toString(); + } + + public static String getSource(String url) { + String source = "0"; + try { + URL addr = new URL(url); + source = addr.getHost(); + } catch (MalformedURLException e) { + e.printStackTrace(); + } + return source; + } + + /** * @param user * @param nickname * @param orgi @@ -765,103 +738,103 @@ public class OnlineUserUtils { * @return * @throws Exception */ - public static NewRequestMessage newRequestMessage(String user , - String nickname, + public static NewRequestMessage newRequestMessage(String user, + String nickname, String orgi, String session, String appid, String ip, String osname, String browser, - String headimg , - IP ipdata , - String channel , - String skill , + String headimg, + IP ipdata, + String channel, + String skill, String agent, String title, - String url , + String url, String traceid, - String initiator , + String initiator, String eventid) throws Exception { - // 坐席服务请求,分配 坐席 - NewRequestMessage data = new NewRequestMessage(); - data.setAppid(appid); - data.setOrgi(orgi); - data.setUserid(user); - data.setSession(session); - data.setType(UKDataContext.MessageTypeEnum.NEW.toString()); - data.setId(UKTools.genID()); + // 坐席服务请求,分配 坐席 + NewRequestMessage data = new NewRequestMessage(); + data.setAppid(appid); + data.setOrgi(orgi); + data.setUserid(user); + data.setSession(session); + data.setType(UKDataContext.MessageTypeEnum.NEW.toString()); + data.setId(UKTools.genID()); - AgentUserService service = UKDataContext.getContext().getBean( - AgentUserService.class); - AgentUser agentUser = service.findByUseridAndOrgi(user , orgi); - if (agentUser == null) { - agentUser = new AgentUser(data.getUserid(),channel, - data.getUserid(), null, data.getOrgi(), data.getAppid()); // 创建排队用户的信息,当前用户只能在队列里存在一次,用 - // UserID作为主键ID存储 - agentUser.setNickname(nickname); - agentUser.setUsername(nickname); - // agentUser.setId(data.getUserid()); - }else if(!agentUser.getUsername().equals(nickname)){ - agentUser.setUsername(nickname); - agentUser.setNickname(nickname); - } - - agentUser.setOsname(osname); - agentUser.setBrowser(browser); - agentUser.setAppid(appid); - agentUser.setSessionid(session); - - if (ipdata != null) { - agentUser.setCountry(ipdata.getCountry()); - agentUser.setProvince(ipdata.getProvince()); - agentUser.setCity(ipdata.getCity()); - if(!StringUtils.isBlank(ip)){ - agentUser.setRegion(ipdata.toString() + "[" + ip + "]"); - }else{ - agentUser.setRegion(ipdata.toString()); - } - } + AgentUserService service = UKDataContext.getContext().getBean( + AgentUserService.class); + AgentUser agentUser = service.findByUseridAndOrgi(user, orgi); + if (agentUser == null) { + agentUser = new AgentUser(data.getUserid(), channel, + data.getUserid(), null, data.getOrgi(), data.getAppid()); // 创建排队用户的信息,当前用户只能在队列里存在一次,用 + // UserID作为主键ID存储 + agentUser.setNickname(nickname); + agentUser.setUsername(nickname); + // agentUser.setId(data.getUserid()); + } else if (!agentUser.getUsername().equals(nickname)) { + agentUser.setUsername(nickname); + agentUser.setNickname(nickname); + } - agentUser.setOwner(eventid); - agentUser.setHeadimgurl(headimg); - - agentUser.setStatus(null); // 修改状态 - agentUser.setTitle(title); - agentUser.setUrl(url); - agentUser.setTraceid(traceid); - agentUser.setOwner(eventid); //智能IVR的 EventID - - CousultInvite invite = OnlineUserUtils.cousult(appid, orgi, UKDataContext.getContext().getBean(ConsultInviteRepository.class)) ; - if(invite!=null && !invite.isTraceuser()){ - OnlineUser onlineUser = (OnlineUser) CacheHelper.getOnlineUserCacheBean().getCacheObject(user, orgi) ; - if(onlineUser!=null){ - OnlineUserRepository onlineUserRes = UKDataContext.getContext().getBean(OnlineUserRepository.class) ; - if(onlineUserRes.countByUseridAndOrgi(user, orgi) == 0){ - onlineUserRes.save(onlineUser) ; - } - } - } + agentUser.setOsname(osname); + agentUser.setBrowser(browser); + agentUser.setAppid(appid); + agentUser.setSessionid(session); + + if (ipdata != null) { + agentUser.setCountry(ipdata.getCountry()); + agentUser.setProvince(ipdata.getProvince()); + agentUser.setCity(ipdata.getCity()); + if (!StringUtils.isBlank(ip)) { + agentUser.setRegion(ipdata.toString() + "[" + ip + "]"); + } else { + agentUser.setRegion(ipdata.toString()); + } + } + + agentUser.setOwner(eventid); + agentUser.setHeadimgurl(headimg); + + agentUser.setStatus(null); // 修改状态 + agentUser.setTitle(title); + agentUser.setUrl(url); + agentUser.setTraceid(traceid); + agentUser.setOwner(eventid); //智能IVR的 EventID + + CousultInvite invite = OnlineUserUtils.cousult(appid, orgi, UKDataContext.getContext().getBean(ConsultInviteRepository.class)); + if (invite != null && !invite.isTraceuser()) { + OnlineUser onlineUser = (OnlineUser) CacheHelper.getOnlineUserCacheBean().getCacheObject(user, orgi); + if (onlineUser != null) { + OnlineUserRepository onlineUserRes = UKDataContext.getContext().getBean(OnlineUserRepository.class); + if (onlineUserRes.countByUseridAndOrgi(user, orgi) == 0) { + onlineUserRes.save(onlineUser); + } + } + } + + MessageInContent inMessage = new MessageInContent(); + inMessage.setChannelMessage(data); + inMessage.setAgentUser(agentUser); + inMessage.setMessage(data.getMessage()); + inMessage.setFromUser(data.getUserid()); + inMessage.setToUser(data.getAppid()); + inMessage.setId(data.getId()); + inMessage.setMessageType(data.getType()); + inMessage.setNickName(agentUser.getNickname()); + inMessage.setOrgi(data.getOrgi()); + inMessage.setUser(agentUser); + + /** + * 技能组 和 坐席 + */ + + agentUser.setSkill(skill); + agentUser.setAgent(agent); - MessageInContent inMessage = new MessageInContent(); - inMessage.setChannelMessage(data); - inMessage.setAgentUser(agentUser); - inMessage.setMessage(data.getMessage()); - inMessage.setFromUser(data.getUserid()); - inMessage.setToUser(data.getAppid()); - inMessage.setId(data.getId()); - inMessage.setMessageType(data.getType()); - inMessage.setNickName(agentUser.getNickname()); - inMessage.setOrgi(data.getOrgi()); - inMessage.setUser(agentUser); - - /** - * 技能组 和 坐席 - */ - - agentUser.setSkill(skill); - agentUser.setAgent(agent); - // if(!StringUtils.isBlank(skill)){ // agentUser.setSkill(skill); // }else{ @@ -873,32 +846,31 @@ public class OnlineUserUtils { // agentUser.setAgent(UKDataContext.SERVICE_QUENE_NULL_STR); // } - MessageDataBean outMessageDataBean = null ; - - SessionConfig sessionConfig = ServiceQuene.initSessionConfig(data.getOrgi()) ; - AgentReport report = ServiceQuene.getAgentReport(data.getOrgi()) ; - - if(sessionConfig.isHourcheck() && !UKTools.isInWorkingHours(sessionConfig.getWorkinghours())){ - data.setMessage(sessionConfig.getNotinwhmsg()); - }else{ - if(report.getAgents() == 0){ - data.setNoagent(true); - } - outMessageDataBean = RouterHelper.getRouteInstance().handler(inMessage); - if (outMessageDataBean != null) { - data.setMessage(outMessageDataBean.getMessage()); - - if(outMessageDataBean.getAgentUser()!=null){ - data.setAgentserviceid(outMessageDataBean.getAgentUser().getAgentserviceid()); - } - } - } - - return data; - } + MessageDataBean outMessageDataBean = null; + + SessionConfig sessionConfig = ServiceQuene.initSessionConfig(data.getOrgi()); + AgentReport report = ServiceQuene.getAgentReport(data.getOrgi()); + + if (sessionConfig.isHourcheck() && !UKTools.isInWorkingHours(sessionConfig.getWorkinghours())) { + data.setMessage(sessionConfig.getNotinwhmsg()); + } else { + if (report.getAgents() == 0) { + data.setNoagent(true); + } + outMessageDataBean = RouterHelper.getRouteInstance().handler(inMessage); + if (outMessageDataBean != null) { + data.setMessage(outMessageDataBean.getMessage()); + + if (outMessageDataBean.getAgentUser() != null) { + data.setAgentserviceid(outMessageDataBean.getAgentUser().getAgentserviceid()); + } + } + } + + return data; + } /** - * * @param userid * @param orgi * @param session @@ -917,7 +889,7 @@ public class OnlineUserUtils { * @return * @throws Exception */ - public static NewRequestMessage newRequestMessage(String userid, + public static NewRequestMessage newRequestMessage(String userid, String orgi, String session, String appid, @@ -932,20 +904,20 @@ public class OnlineUserUtils { String url, String traceid, String initiator) throws Exception { - IP ipdata = null ; - if(!StringUtils.isBlank(ip)){ - ipdata = IPTools.getInstance().findGeography(ip); - } - if(StringUtils.isBlank(nickname)){ - nickname = "Guest_" + userid; - } - - return newRequestMessage(userid , nickname, orgi, session, appid, ip, osname, browser , "" , ipdata , channel , skill , agent , title ,url , traceid , initiator , session) ; - } + IP ipdata = null; + if (!StringUtils.isBlank(ip)) { + ipdata = IPTools.getInstance().findGeography(ip); + } + if (StringUtils.isBlank(nickname)) { + nickname = "Guest_" + userid; + } + + return newRequestMessage(userid, nickname, orgi, session, appid, ip, osname, browser, "", ipdata, channel, skill, agent, title, url, traceid, initiator, session); + } /** - * * Create agentuser object for Wechat Channel + * * @param openid * @param nickname * @param orgi @@ -962,301 +934,305 @@ public class OnlineUserUtils { * @return * @throws Exception */ - public static NewRequestMessage newRequestMessage(String openid , + public static NewRequestMessage newRequestMessage(String openid, String nickname, String orgi, String session, - String appid , - String headimg , - String country , - String province , - String city , - String channel , - String skill , + String appid, + String headimg, + String country, + String province, + String city, + String channel, + String skill, String agent, String initiator) throws Exception { - IP ipdata = new IP() ; - ipdata.setCountry(country); - ipdata.setProvince(province); - ipdata.setCity(city); - return newRequestMessage(openid , nickname , orgi, session, appid, null , null , null , headimg , ipdata , channel , skill , agent , null , null , null , initiator , session) ; - } + IP ipdata = new IP(); + ipdata.setCountry(country); + ipdata.setProvince(province); + ipdata.setCity(city); + return newRequestMessage(openid, nickname, orgi, session, appid, null, null, null, headimg, ipdata, channel, skill, agent, null, null, null, initiator, session); + } - public static void parseParameters(Map map, String data, - String encoding) throws UnsupportedEncodingException { - if ((data == null) || (data.length() <= 0)) { - return; - } + public static void parseParameters(Map map, String data, + String encoding) throws UnsupportedEncodingException { + if ((data == null) || (data.length() <= 0)) { + return; + } - byte[] bytes = null; - try { - if (encoding == null) - bytes = data.getBytes(); - else - bytes = data.getBytes(encoding); - } catch (UnsupportedEncodingException uee) { - } - parseParameters(map, bytes, encoding); - } + byte[] bytes = null; + try { + if (encoding == null) + bytes = data.getBytes(); + else + bytes = data.getBytes(encoding); + } catch (UnsupportedEncodingException uee) { + } + parseParameters(map, bytes, encoding); + } - public static void parseParameters(Map map, byte[] data, - String encoding) throws UnsupportedEncodingException { - if ((data != null) && (data.length > 0)) { - int ix = 0; - int ox = 0; - String key = null; - String value = null; - while (ix < data.length) { - byte c = data[(ix++)]; - switch ((char) c) { - case '&': - value = new String(data, 0, ox, encoding); - if (key != null) { - putMapEntry(map, key, value); - key = null; - } - ox = 0; - break; - case '=': - if (key == null) { - key = new String(data, 0, ox, encoding); - ox = 0; - } else { - data[(ox++)] = c; - } - break; - case '+': - data[(ox++)] = 32; - break; - case '%': - data[(ox++)] = (byte) ((convertHexDigit(data[(ix++)]) << 4) + convertHexDigit(data[(ix++)])); + public static void parseParameters(Map map, byte[] data, + String encoding) throws UnsupportedEncodingException { + if ((data != null) && (data.length > 0)) { + int ix = 0; + int ox = 0; + String key = null; + String value = null; + while (ix < data.length) { + byte c = data[(ix++)]; + switch ((char) c) { + case '&': + value = new String(data, 0, ox, encoding); + if (key != null) { + putMapEntry(map, key, value); + key = null; + } + ox = 0; + break; + case '=': + if (key == null) { + key = new String(data, 0, ox, encoding); + ox = 0; + } else { + data[(ox++)] = c; + } + break; + case '+': + data[(ox++)] = 32; + break; + case '%': + data[(ox++)] = (byte) ((convertHexDigit(data[(ix++)]) << 4) + convertHexDigit(data[(ix++)])); - break; - default: - data[(ox++)] = c; - } - } + break; + default: + data[(ox++)] = c; + } + } - if (key != null) { - value = new String(data, 0, ox, encoding); - putMapEntry(map, key, value); - } - } - } + if (key != null) { + value = new String(data, 0, ox, encoding); + putMapEntry(map, key, value); + } + } + } - private static void putMapEntry(Map map, String name, - String value) { - String[] newValues = null; - String[] oldValues = (String[]) (String[]) map.get(name); - if (oldValues == null) { - newValues = new String[1]; - newValues[0] = value; - } else { - newValues = new String[oldValues.length + 1]; - System.arraycopy(oldValues, 0, newValues, 0, oldValues.length); - newValues[oldValues.length] = value; - } - map.put(name, newValues); - } + private static void putMapEntry(Map map, String name, + String value) { + String[] newValues = null; + String[] oldValues = (String[]) (String[]) map.get(name); + if (oldValues == null) { + newValues = new String[1]; + newValues[0] = value; + } else { + newValues = new String[oldValues.length + 1]; + System.arraycopy(oldValues, 0, newValues, 0, oldValues.length); + newValues[oldValues.length] = value; + } + map.put(name, newValues); + } - private static byte convertHexDigit(byte b) { - if ((b >= 48) && (b <= 57)) - return (byte) (b - 48); - if ((b >= 97) && (b <= 102)) - return (byte) (b - 97 + 10); - if ((b >= 65) && (b <= 70)) - return (byte) (b - 65 + 10); - return 0; - } + private static byte convertHexDigit(byte b) { + if ((b >= 48) && (b <= 57)) + return (byte) (b - 48); + if ((b >= 97) && (b <= 102)) + return (byte) (b - 97 + 10); + if ((b >= 65) && (b <= 70)) + return (byte) (b - 65 + 10); + return 0; + } - // public static void main(String[] args){ - // System.out.println(getKeyword("http://www.so.com/link?url=http%3A%2F%2Fwww.r3yun.com%2F&q=R3+Query%E5%AE%98%E7%BD%91&ts=1484181457&t=e2ad49617cd5de0eb0937f3e2a84669&src=haosou")) - // ; - // System.out.println(getSource("https://www.google.com.hk/")) ; - // } - - /** - * 发送邀请 - * @param userid - * @throws Exception - */ - public static void sendWebIMClients(String userid , String msg) throws Exception{ - List clients = OnlineUserUtils.webIMClients.getClients(userid) ; - if(clients!=null && clients.size()>0){ - for(WebIMClient client : clients){ - try{ - client.getSse().send(SseEmitter.event().reconnectTime(0).data(msg)); - }catch(Exception ex){ - OnlineUserUtils.webIMClients.removeClient(userid , client.getClient() , true) ; - }finally{ - client.getSse().complete(); - } - } - } - } - public static void resetHotTopic(DataExchangeInterface dataExchange,User user , String orgi , String aiid) { - if(CacheHelper.getSystemCacheBean().getCacheObject("xiaoeTopic", orgi)!=null){ - CacheHelper.getSystemCacheBean().delete("xiaoeTopic", orgi) ; - } - cacheHotTopic(dataExchange,user , orgi , aiid) ; - } + // public static void main(String[] args){ + // System.out.println(getKeyword("http://www.so.com/link?url=http%3A%2F%2Fwww.r3yun.com%2F&q=R3+Query%E5%AE%98%E7%BD%91&ts=1484181457&t=e2ad49617cd5de0eb0937f3e2a84669&src=haosou")) + // ; + // System.out.println(getSource("https://www.google.com.hk/")) ; + // } - @SuppressWarnings("unchecked") - public static List cacheHotTopic(DataExchangeInterface dataExchange,User user , String orgi , String aiid) { - List topicList = null ; - if((topicList = (List) CacheHelper.getSystemCacheBean().getCacheObject("xiaoeTopic", orgi))==null){ - topicList = (List) dataExchange.getListDataByIdAndOrgi(aiid, null, orgi) ; - //CacheHelper.getSystemCacheBean().put("xiaoeTopic" , topicList , orgi) ; - } - return topicList; - } - - public static void resetHotTopicType(DataExchangeInterface dataExchange,User user , String orgi, String aiid) { - if(CacheHelper.getSystemCacheBean().getCacheObject("xiaoeTopicType"+"."+orgi, orgi)!=null){ - CacheHelper.getSystemCacheBean().delete("xiaoeTopicType"+"."+orgi, orgi) ; - } - cacheHotTopicType(dataExchange,user , orgi , aiid) ; - } - @SuppressWarnings("unchecked") - public static List cacheHotTopicType(DataExchangeInterface dataExchange,User user , String orgi , String aiid) { - List topicTypeList = null ; - if((topicTypeList = (List) CacheHelper.getSystemCacheBean().getCacheObject("xiaoeTopicType"+"."+orgi, orgi))==null){ - topicTypeList = (List) dataExchange.getListDataByIdAndOrgi(aiid, null, orgi) ; - CacheHelper.getSystemCacheBean().put("xiaoeTopicType"+"."+orgi , topicTypeList , orgi) ; - } - return topicTypeList; - } - - @SuppressWarnings("unchecked") - public static List cacheSceneType(DataExchangeInterface dataExchange,User user , String orgi) { - List sceneTypeList = null ; - if((sceneTypeList = (List) CacheHelper.getSystemCacheBean().getCacheObject("xiaoeSceneType", orgi))==null){ - sceneTypeList = (List) dataExchange.getListDataByIdAndOrgi(null, null, orgi) ; - //CacheHelper.getSystemCacheBean().put("xiaoeSceneType" , sceneTypeList , orgi) ; - } - return sceneTypeList; - } - - @SuppressWarnings("unchecked") - public static boolean filterSceneType(String cate ,String orgi , IP ipdata) { - boolean result = false ; - List sceneTypeList = cacheSceneType((DataExchangeInterface) UKDataContext.getContext().getBean("scenetype"), null, orgi) ; - List areaTypeList = (List) CacheHelper.getSystemCacheBean().getCacheObject(UKDataContext.UKEFU_SYSTEM_AREA, UKDataContext.SYSTEM_ORGI) ; - if(sceneTypeList!=null && cate != null && !UKDataContext.DEFAULT_TYPE.equals(cate)){ - for(SceneType sceneType : sceneTypeList){ - if(cate.equals(sceneType.getId())){ - if(!StringUtils.isBlank(sceneType.getArea())){ - if(ipdata!=null){ - List atList = getAreaTypeList(sceneType.getArea(), areaTypeList) ; //找到技能组配置的地区信息 - for(AreaType areaType : atList){ - if(areaType.getArea().indexOf(ipdata.getProvince()) >= 0 || areaType.getArea().indexOf(ipdata.getCity()) >= 0 ){ - result = true ; break ; - } - } - } - }else{ - result = true ; - } - } - if(result){ - break ; - } - } - }else{ - result = true; - } - return result; - } - - public static List search(String q , String orgi , User user) throws IOException, TemplateException { - List otherMessageItemList = null ; - String param = "" ; - SessionConfig sessionConfig = ServiceQuene.initSessionConfig(orgi) ; - if(!StringUtils.isBlank(sessionConfig.getOqrsearchurl())) { - Template templet = UKTools.getTemplate(sessionConfig.getOqrsearchinput()) ; - Map values = new HashMap(); - values.put("q", q) ; - values.put("user", user) ; - param = UKTools.getTemplet(templet.getTemplettext(), values) ; - } - String result = HttpClientUtil.doPost(sessionConfig.getOqrsearchurl(), param) , text = null; - if(!StringUtils.isBlank(result) && !StringUtils.isBlank(sessionConfig.getOqrsearchoutput()) && !result.equals("error")) { - Template templet = UKTools.getTemplate(sessionConfig.getOqrsearchoutput()) ; - @SuppressWarnings("unchecked") - Map jsonData = objectMapper.readValue(result, Map.class) ; - Map values = new HashMap(); - values.put("q", q) ; - values.put("user", user) ; - values.put("data", jsonData) ; - text = UKTools.getTemplet(templet.getTemplettext(), values) ; - } - if(!StringUtils.isBlank(text)){ - JavaType javaType = getCollectionType(ArrayList.class, OtherMessageItem.class); - otherMessageItemList = objectMapper.readValue(text, javaType) ; - } - return otherMessageItemList ; - } - - public static OtherMessageItem suggestdetail(AiConfig aiCofig , String id , String orgi , User user) throws IOException, TemplateException { - OtherMessageItem otherMessageItem = null ; - String param = "" ; - if(!StringUtils.isBlank(aiCofig.getOqrdetailinput())) { - Template templet = UKTools.getTemplate(aiCofig.getOqrdetailinput()) ; - Map values = new HashMap(); - values.put("id", id) ; - values.put("user", user) ; - param = UKTools.getTemplet(templet.getTemplettext(), values) ; - } - if(!StringUtils.isBlank(aiCofig.getOqrdetailurl())) { - String result = HttpClientUtil.doPost(aiCofig.getOqrdetailurl(), param) , text = null; - if(!StringUtils.isBlank(aiCofig.getOqrdetailoutput()) && !result.equals("error")) { - Template templet = UKTools.getTemplate(aiCofig.getOqrdetailoutput()) ; - @SuppressWarnings("unchecked") - Map jsonData = objectMapper.readValue(result, Map.class) ; - Map values = new HashMap(); - values.put("id",id) ; - values.put("user", user) ; - values.put("data", jsonData) ; - text = UKTools.getTemplet(templet.getTemplettext(), values) ; - } - if(!StringUtils.isBlank(text)){ - otherMessageItem = objectMapper.readValue(text, OtherMessageItem.class) ; - } - } - return otherMessageItem ; - } - - public static OtherMessageItem detail(String id , String orgi , User user) throws IOException, TemplateException { - OtherMessageItem otherMessageItem = null ; - String param = "" ; - SessionConfig sessionConfig = ServiceQuene.initSessionConfig(orgi) ; - if(!StringUtils.isBlank(sessionConfig.getOqrdetailinput())) { - Template templet = UKTools.getTemplate(sessionConfig.getOqrdetailinput()) ; - Map values = new HashMap(); - values.put("id", id) ; - values.put("user", user) ; - param = UKTools.getTemplet(templet.getTemplettext(), values) ; - } - if(!StringUtils.isBlank(sessionConfig.getOqrdetailurl())) { - String result = HttpClientUtil.doPost(sessionConfig.getOqrdetailurl(), param) , text = null; - if(!StringUtils.isBlank(sessionConfig.getOqrdetailoutput()) && !result.equals("error")) { - Template templet = UKTools.getTemplate(sessionConfig.getOqrdetailoutput()) ; - @SuppressWarnings("unchecked") - Map jsonData = objectMapper.readValue(result, Map.class) ; - Map values = new HashMap(); - values.put("id",id) ; - values.put("user", user) ; - values.put("data", jsonData) ; - text = UKTools.getTemplet(templet.getTemplettext(), values) ; - } - if(!StringUtils.isBlank(text)){ - otherMessageItem = objectMapper.readValue(text, OtherMessageItem.class) ; - } - } - return otherMessageItem ; - } - - public static JavaType getCollectionType(Class collectionClass, Class... elementClasses) { - return objectMapper.getTypeFactory().constructParametricType(collectionClass, elementClasses); - } + /** + * 发送邀请 + * + * @param userid + * @throws Exception + */ + public static void sendWebIMClients(String userid, String msg) throws Exception { + List clients = OnlineUserUtils.webIMClients.getClients(userid); + if (clients != null && clients.size() > 0) { + for (WebIMClient client : clients) { + try { + client.getSse().send(SseEmitter.event().reconnectTime(0).data(msg)); + } catch (Exception ex) { + OnlineUserUtils.webIMClients.removeClient(userid, client.getClient(), true); + } finally { + client.getSse().complete(); + } + } + } + } + + public static void resetHotTopic(DataExchangeInterface dataExchange, User user, String orgi, String aiid) { + if (CacheHelper.getSystemCacheBean().getCacheObject("xiaoeTopic", orgi) != null) { + CacheHelper.getSystemCacheBean().delete("xiaoeTopic", orgi); + } + cacheHotTopic(dataExchange, user, orgi, aiid); + } + + @SuppressWarnings("unchecked") + public static List cacheHotTopic(DataExchangeInterface dataExchange, User user, String orgi, String aiid) { + List topicList = null; + if ((topicList = (List) CacheHelper.getSystemCacheBean().getCacheObject("xiaoeTopic", orgi)) == null) { + topicList = (List) dataExchange.getListDataByIdAndOrgi(aiid, null, orgi); + //CacheHelper.getSystemCacheBean().put("xiaoeTopic" , topicList , orgi) ; + } + return topicList; + } + + public static void resetHotTopicType(DataExchangeInterface dataExchange, User user, String orgi, String aiid) { + if (CacheHelper.getSystemCacheBean().getCacheObject("xiaoeTopicType" + "." + orgi, orgi) != null) { + CacheHelper.getSystemCacheBean().delete("xiaoeTopicType" + "." + orgi, orgi); + } + cacheHotTopicType(dataExchange, user, orgi, aiid); + } + + @SuppressWarnings("unchecked") + public static List cacheHotTopicType(DataExchangeInterface dataExchange, User user, String orgi, String aiid) { + List topicTypeList = null; + if ((topicTypeList = (List) CacheHelper.getSystemCacheBean().getCacheObject("xiaoeTopicType" + "." + orgi, orgi)) == null) { + topicTypeList = (List) dataExchange.getListDataByIdAndOrgi(aiid, null, orgi); + CacheHelper.getSystemCacheBean().put("xiaoeTopicType" + "." + orgi, topicTypeList, orgi); + } + return topicTypeList; + } + + @SuppressWarnings("unchecked") + public static List cacheSceneType(DataExchangeInterface dataExchange, User user, String orgi) { + List sceneTypeList = null; + if ((sceneTypeList = (List) CacheHelper.getSystemCacheBean().getCacheObject("xiaoeSceneType", orgi)) == null) { + sceneTypeList = (List) dataExchange.getListDataByIdAndOrgi(null, null, orgi); + //CacheHelper.getSystemCacheBean().put("xiaoeSceneType" , sceneTypeList , orgi) ; + } + return sceneTypeList; + } + + @SuppressWarnings("unchecked") + public static boolean filterSceneType(String cate, String orgi, IP ipdata) { + boolean result = false; + List sceneTypeList = cacheSceneType((DataExchangeInterface) UKDataContext.getContext().getBean("scenetype"), null, orgi); + List areaTypeList = (List) CacheHelper.getSystemCacheBean().getCacheObject(UKDataContext.UKEFU_SYSTEM_AREA, UKDataContext.SYSTEM_ORGI); + if (sceneTypeList != null && cate != null && !UKDataContext.DEFAULT_TYPE.equals(cate)) { + for (SceneType sceneType : sceneTypeList) { + if (cate.equals(sceneType.getId())) { + if (!StringUtils.isBlank(sceneType.getArea())) { + if (ipdata != null) { + List atList = getAreaTypeList(sceneType.getArea(), areaTypeList); //找到技能组配置的地区信息 + for (AreaType areaType : atList) { + if (areaType.getArea().indexOf(ipdata.getProvince()) >= 0 || areaType.getArea().indexOf(ipdata.getCity()) >= 0) { + result = true; + break; + } + } + } + } else { + result = true; + } + } + if (result) { + break; + } + } + } else { + result = true; + } + return result; + } + + public static List search(String q, String orgi, User user) throws IOException, TemplateException { + List otherMessageItemList = null; + String param = ""; + SessionConfig sessionConfig = ServiceQuene.initSessionConfig(orgi); + if (!StringUtils.isBlank(sessionConfig.getOqrsearchurl())) { + Template templet = UKTools.getTemplate(sessionConfig.getOqrsearchinput()); + Map values = new HashMap(); + values.put("q", q); + values.put("user", user); + param = UKTools.getTemplet(templet.getTemplettext(), values); + } + String result = HttpClientUtil.doPost(sessionConfig.getOqrsearchurl(), param), text = null; + if (!StringUtils.isBlank(result) && !StringUtils.isBlank(sessionConfig.getOqrsearchoutput()) && !result.equals("error")) { + Template templet = UKTools.getTemplate(sessionConfig.getOqrsearchoutput()); + @SuppressWarnings("unchecked") + Map jsonData = objectMapper.readValue(result, Map.class); + Map values = new HashMap(); + values.put("q", q); + values.put("user", user); + values.put("data", jsonData); + text = UKTools.getTemplet(templet.getTemplettext(), values); + } + if (!StringUtils.isBlank(text)) { + JavaType javaType = getCollectionType(ArrayList.class, OtherMessageItem.class); + otherMessageItemList = objectMapper.readValue(text, javaType); + } + return otherMessageItemList; + } + + public static OtherMessageItem suggestdetail(AiConfig aiCofig, String id, String orgi, User user) throws IOException, TemplateException { + OtherMessageItem otherMessageItem = null; + String param = ""; + if (!StringUtils.isBlank(aiCofig.getOqrdetailinput())) { + Template templet = UKTools.getTemplate(aiCofig.getOqrdetailinput()); + Map values = new HashMap(); + values.put("id", id); + values.put("user", user); + param = UKTools.getTemplet(templet.getTemplettext(), values); + } + if (!StringUtils.isBlank(aiCofig.getOqrdetailurl())) { + String result = HttpClientUtil.doPost(aiCofig.getOqrdetailurl(), param), text = null; + if (!StringUtils.isBlank(aiCofig.getOqrdetailoutput()) && !result.equals("error")) { + Template templet = UKTools.getTemplate(aiCofig.getOqrdetailoutput()); + @SuppressWarnings("unchecked") + Map jsonData = objectMapper.readValue(result, Map.class); + Map values = new HashMap(); + values.put("id", id); + values.put("user", user); + values.put("data", jsonData); + text = UKTools.getTemplet(templet.getTemplettext(), values); + } + if (!StringUtils.isBlank(text)) { + otherMessageItem = objectMapper.readValue(text, OtherMessageItem.class); + } + } + return otherMessageItem; + } + + public static OtherMessageItem detail(String id, String orgi, User user) throws IOException, TemplateException { + OtherMessageItem otherMessageItem = null; + String param = ""; + SessionConfig sessionConfig = ServiceQuene.initSessionConfig(orgi); + if (!StringUtils.isBlank(sessionConfig.getOqrdetailinput())) { + Template templet = UKTools.getTemplate(sessionConfig.getOqrdetailinput()); + Map values = new HashMap(); + values.put("id", id); + values.put("user", user); + param = UKTools.getTemplet(templet.getTemplettext(), values); + } + if (!StringUtils.isBlank(sessionConfig.getOqrdetailurl())) { + String result = HttpClientUtil.doPost(sessionConfig.getOqrdetailurl(), param), text = null; + if (!StringUtils.isBlank(sessionConfig.getOqrdetailoutput()) && !result.equals("error")) { + Template templet = UKTools.getTemplate(sessionConfig.getOqrdetailoutput()); + @SuppressWarnings("unchecked") + Map jsonData = objectMapper.readValue(result, Map.class); + Map values = new HashMap(); + values.put("id", id); + values.put("user", user); + values.put("data", jsonData); + text = UKTools.getTemplet(templet.getTemplettext(), values); + } + if (!StringUtils.isBlank(text)) { + otherMessageItem = objectMapper.readValue(text, OtherMessageItem.class); + } + } + return otherMessageItem; + } + + public static JavaType getCollectionType(Class collectionClass, Class... elementClasses) { + return objectMapper.getTypeFactory().constructParametricType(collectionClass, elementClasses); + } } diff --git a/contact-center/app/src/main/java/com/chatopera/cc/webim/util/chatbot/ChatbotUtils.java b/contact-center/app/src/main/java/com/chatopera/cc/webim/util/chatbot/ChatbotUtils.java index 79a3ca2c..9df97cad 100644 --- a/contact-center/app/src/main/java/com/chatopera/cc/webim/util/chatbot/ChatbotUtils.java +++ b/contact-center/app/src/main/java/com/chatopera/cc/webim/util/chatbot/ChatbotUtils.java @@ -22,7 +22,7 @@ import java.util.HashSet; public class ChatbotUtils { public static final HashSet VALID_LANGS = new HashSet(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 VALID_WORKMODELS = new HashSet(Arrays.asList(new String[]{CHATBOT_FIRST, HUMAN_FIRST})); diff --git a/contact-center/app/src/main/java/com/chatopera/cc/webim/util/server/handler/AiIMEventHandler.java b/contact-center/app/src/main/java/com/chatopera/cc/webim/util/server/handler/AiIMEventHandler.java deleted file mode 100644 index 1c36d980..00000000 --- a/contact-center/app/src/main/java/com/chatopera/cc/webim/util/server/handler/AiIMEventHandler.java +++ /dev/null @@ -1,200 +0,0 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018 Chatopera Inc, - * - * 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); - } -} \ No newline at end of file diff --git a/contact-center/app/src/main/java/com/chatopera/cc/webim/web/handler/api/rest/ApiChatbotController.java b/contact-center/app/src/main/java/com/chatopera/cc/webim/web/handler/api/rest/ApiChatbotController.java index c2d96a0b..41b9c986 100644 --- a/contact-center/app/src/main/java/com/chatopera/cc/webim/web/handler/api/rest/ApiChatbotController.java +++ b/contact-center/app/src/main/java/com/chatopera/cc/webim/web/handler/api/rest/ApiChatbotController.java @@ -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(); 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 96eac4d5..261dd514 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 @@ -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 chatbotConfig = new HashMap(); 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 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 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 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); diff --git a/contact-center/app/src/main/resources/templates/apps/im/chatbot/index.html b/contact-center/app/src/main/resources/templates/apps/im/chatbot/index.html index 22566be4..63b0c747 100644 --- a/contact-center/app/src/main/resources/templates/apps/im/chatbot/index.html +++ b/contact-center/app/src/main/resources/templates/apps/im/chatbot/index.html @@ -264,14 +264,14 @@
diff --git a/contact-center/app/src/main/resources/templates/apps/im/index.html b/contact-center/app/src/main/resources/templates/apps/im/index.html index 95644bce..5f7f611e 100644 --- a/contact-center/app/src/main/resources/templates/apps/im/index.html +++ b/contact-center/app/src/main/resources/templates/apps/im/index.html @@ -264,7 +264,7 @@
    - <#if models?? && models["xiaoe"]?? && models["xiaoe"] == true && inviteData.ai && aiid??> + <#if models?? && models["chatbot"]?? && models["chatbot"] == true && inviteData.ai && aiid??> <#if !exchange?? || exchange == "true">
  • 智能客服
  • diff --git a/contact-center/config/postman/Chatopera_cc_v1.postman_collection.json b/contact-center/config/postman/Chatopera_cc_v1.postman_collection.json index e97b8f47..9e6f3af9 100644 --- a/contact-center/config/postman/Chatopera_cc_v1.postman_collection.json +++ b/contact-center/config/postman/Chatopera_cc_v1.postman_collection.json @@ -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": [