diff --git a/contact-center/app/src/main/java/com/chatopera/cc/basic/Constants.java b/contact-center/app/src/main/java/com/chatopera/cc/basic/Constants.java index dfc6274b..d03392c1 100644 --- a/contact-center/app/src/main/java/com/chatopera/cc/basic/Constants.java +++ b/contact-center/app/src/main/java/com/chatopera/cc/basic/Constants.java @@ -190,7 +190,8 @@ public class Constants { public static final HashSet CHATBOT_VALID_LANGS = new HashSet(Arrays.asList("zh_CN", "en_US")); public static final String CHATBOT_CHATBOT_FIRST = "机器人客服优先"; public static final String CHATBOT_HUMAN_FIRST = "人工客服优先"; - public static final HashSet CHATBOT_VALID_WORKMODELS = new HashSet(Arrays.asList(CHATBOT_CHATBOT_FIRST, CHATBOT_HUMAN_FIRST)); + public static final String CHATBOT_CHATBOT_ONLY = "仅机器人客服"; + public static final HashSet CHATBOT_VALID_WORKMODELS = new HashSet(Arrays.asList(CHATBOT_CHATBOT_FIRST, CHATBOT_HUMAN_FIRST, CHATBOT_CHATBOT_ONLY)); } diff --git a/contact-center/app/src/main/java/com/chatopera/cc/controller/apps/AppsController.java b/contact-center/app/src/main/java/com/chatopera/cc/controller/apps/AppsController.java index d225a963..f3c924c8 100644 --- a/contact-center/app/src/main/java/com/chatopera/cc/controller/apps/AppsController.java +++ b/contact-center/app/src/main/java/com/chatopera/cc/controller/apps/AppsController.java @@ -95,7 +95,7 @@ public class AppsController extends Handler { Sort.Direction.DESC, "createtime" ) - ); + ); final long msec = System.currentTimeMillis(); final List contactIds = new ArrayList(); @@ -143,7 +143,7 @@ public class AppsController extends Handler { map.put( "webIMReport", MainUtils.getWebIMReport( userEventRes.findByOrgiAndCreatetimeRange(super.getOrgi(request), MainUtils.getStartTime(), - MainUtils.getEndTime()))); + MainUtils.getEndTime()))); // TODO 此处为什么不用agentReport中的agents? map.put("agents", getUsers(request).size()); @@ -252,8 +252,6 @@ public class AppsController extends Handler { if (logined.isAdmin()) { // 作为管理员,强制设置为坐席 tempUser.setAgent(true); - } else { - tempUser.setAgent(user.isAgent()); } tempUser.setOrgi(super.getOrgiByTenantshare(request)); diff --git a/contact-center/app/src/main/java/com/chatopera/cc/controller/apps/IMController.java b/contact-center/app/src/main/java/com/chatopera/cc/controller/apps/IMController.java index 34537204..3a277fe5 100644 --- a/contact-center/app/src/main/java/com/chatopera/cc/controller/apps/IMController.java +++ b/contact-center/app/src/main/java/com/chatopera/cc/controller/apps/IMController.java @@ -136,6 +136,8 @@ public class IMController extends Handler { @Autowired private UserHistoryRepository userHistoryRes; + @Autowired + private ChatbotRepository chatbotRes; @Autowired private Cache cache; @@ -374,9 +376,9 @@ public class IMController extends Handler { } else { if (!whitelist_mode) { createContacts(userid, - request, - logined.getId(), - uid, cid, sid, username, company_name, system_name); + request, + logined.getId(), + uid, cid, sid, username, company_name, system_name); } } @@ -560,7 +562,9 @@ public class IMController extends Handler { @Valid final String pid, @Valid final String purl, @Valid final boolean isInvite) throws Exception { - logger.info("[index] orgi {}, skill {}, agent {}, traceid {}, isInvite {}", orgi, skill, agent, traceid, isInvite); + logger.info( + "[index] orgi {}, skill {}, agent {}, traceid {}, isInvite {}, exchange {}", orgi, skill, agent, + traceid, isInvite, exchange); Map sessionMessageObj = cache.findOneSystemMapByIdAndOrgi(sessionid, orgi); if (sessionMessageObj != null) { @@ -660,12 +664,12 @@ public class IMController extends Handler { } AgentReport report; - if (invite.isSkill() && invite.isConsult_skill_fixed()) { // 绑定技能组 report = acdWorkMonitor.getAgentReport(invite.getConsult_skill_fixed_id(), invite.getOrgi()); } else { report = acdWorkMonitor.getAgentReport(invite.getOrgi()); } + boolean isLeavemsg = false; if (report.getAgents() == 0 || (sessionConfig.isHourcheck() && @@ -768,7 +772,8 @@ public class IMController extends Handler { String cid = (String) request.getSession().getAttribute("Sessioncid"); if (StringUtils.isNotBlank(uid) && StringUtils.isNotBlank(sid) && StringUtils.isNotBlank(cid)) { - Contacts contacts1 = contactsRes.findOneByWluidAndWlsidAndWlcidAndDatastatus(uid, sid, cid, false); + Contacts contacts1 = contactsRes.findOneByWluidAndWlsidAndWlcidAndDatastatus( + uid, sid, cid, false); if (contacts1 != null) { agentUserRepository.findOneByUseridAndOrgi(userid, orgi).ifPresent(p -> { // 关联AgentService的联系人 @@ -828,17 +833,23 @@ public class IMController extends Handler { map.addAttribute("username", nickname); // 是否使用机器人客服 + Chatbot bot = null; if (MainContext.hasModule(Constants.CSKEFU_MODULE_CHATBOT) && StringUtils.isNotBlank(invite.getAiid()) && invite.isAi() && + ((bot = chatbotRes.findOne(invite.getAiid())) != null) && ((StringUtils.equals( ai, "true")) || (invite.isAifirst() && ai == null))) { //启用 AI , 并且 AI优先 接待 + HashMap chatbotConfig = new HashMap(); chatbotConfig.put("botname", invite.getAiname()); chatbotConfig.put("botid", invite.getAiid()); chatbotConfig.put("botwelcome", invite.getAimsg()); chatbotConfig.put("botfirst", Boolean.toString(invite.isAifirst())); chatbotConfig.put("isai", Boolean.toString(invite.isAi())); + map.addAttribute( + "exchange", !StringUtils.equals(bot.getWorkmode(), Constants.CHATBOT_CHATBOT_ONLY)); + if (chatbotConfig != null) { map.addAttribute("chatbotConfig", chatbotConfig); } @@ -848,15 +859,16 @@ public class IMController extends Handler { "/apps/im/chatbot/mobile")); // 智能机器人 移动端 } } else { - if (!isLeavemsg && (MobileDevice.isMobile(request.getHeader("User-Agent")) || StringUtils.isNotBlank(mobile))) { + if (!isLeavemsg && (MobileDevice.isMobile( + request.getHeader("User-Agent")) || StringUtils.isNotBlank(mobile))) { view = request( super.createRequestPageTempletResponse("/apps/im/mobile")); // WebIM移动端。再次点选技能组? } } map.addAttribute( "chatMessageList", chatMessageRes.findByUsessionAndOrgi(userid, orgi, new PageRequest(0, 20, - Direction.DESC, - "updatetime"))); + Direction.DESC, + "updatetime"))); } view.addObject("commentList", Dict.getInstance().getDic(Constants.CSKEFU_SYSTEM_COMMENT_DIC)); view.addObject("commentItemList", Dict.getInstance().getDic(Constants.CSKEFU_SYSTEM_COMMENT_ITEM_DIC)); @@ -1133,7 +1145,7 @@ public class IMController extends Handler { // 存储到本地硬盘 String id = processAttachmentFile(multipart, - fileid, logined.getOrgi(), logined.getId()); + fileid, logined.getOrgi(), logined.getId()); upload = new UploadStatus("0", "/res/file.html?id=" + id); String file = "/res/file.html?id=" + id; diff --git a/contact-center/app/src/main/resources/templates/apps/business/contacts/add.html b/contact-center/app/src/main/resources/templates/apps/business/contacts/add.html index 4b5d05e1..4d74ae67 100644 --- a/contact-center/app/src/main/resources/templates/apps/business/contacts/add.html +++ b/contact-center/app/src/main/resources/templates/apps/business/contacts/add.html @@ -79,7 +79,7 @@
-
@@ -87,7 +87,7 @@
- +
@@ -159,11 +159,6 @@ var form = layui.form(); form.render(); //更新全部 form.verify({ - entphone: function(value){ - if(value!="" && !new RegExp(/^(0\d{2,3}-{0,1}\d{5,8}(-{0,1}\d{3,5}){0,1})|(((13[0-9])|(15([0-3]|[5-9]))|(18[0-9]))\d{8})$/).test(value)){ - return '请输入正确的电话号码'; - } - }, entemail: function(value){ if(value!="" && !new RegExp(/^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+/).test(value)){ return '请输入正确的电子邮箱地址'; diff --git a/contact-center/app/src/main/resources/templates/apps/business/contacts/edit.html b/contact-center/app/src/main/resources/templates/apps/business/contacts/edit.html index 7c9cd24b..14e3a7e7 100644 --- a/contact-center/app/src/main/resources/templates/apps/business/contacts/edit.html +++ b/contact-center/app/src/main/resources/templates/apps/business/contacts/edit.html @@ -93,14 +93,14 @@
-
- +
@@ -172,11 +172,6 @@ var form = layui.form(); form.render(); //更新全部 form.verify({ - entphone: function(value){ - if(value!="" && !new RegExp(/^(0\d{2,3}-{0,1}\d{5,8}(-{0,1}\d{3,5}){0,1})|(((13[0-9])|(15([0-3]|[5-9]))|(18[0-9]))\d{8})$/).test(value)){ - return '请输入正确的电话号码'; - } - }, entemail: function(value){ if(value!="" && !new RegExp(/^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+/).test(value)){ return '请输入正确的电子邮箱地址'; diff --git a/contact-center/app/src/main/resources/templates/apps/business/contacts/embed/add.html b/contact-center/app/src/main/resources/templates/apps/business/contacts/embed/add.html index a6def785..d43efaae 100644 --- a/contact-center/app/src/main/resources/templates/apps/business/contacts/embed/add.html +++ b/contact-center/app/src/main/resources/templates/apps/business/contacts/embed/add.html @@ -81,14 +81,14 @@
-
- +
@@ -161,11 +161,6 @@ var form = layui.form(); form.render(); //更新全部 form.verify({ - entphone: function(value){ - if(value!="" && !new RegExp(/^(0\d{2,3}-{0,1}\d{5,8}(-{0,1}\d{3,5}){0,1})|(((13[0-9])|(15([0-3]|[5-9]))|(18[0-9]))\d{8})$/).test(value)){ - return '请输入正确的电话号码'; - } - }, entemail: function(value){ if(value!="" && !new RegExp(/^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+/).test(value)){ return '请输入正确的电子邮箱地址'; diff --git a/contact-center/app/src/main/resources/templates/apps/business/contacts/embed/edit.html b/contact-center/app/src/main/resources/templates/apps/business/contacts/embed/edit.html index 2bd1bdc9..f8cd416f 100644 --- a/contact-center/app/src/main/resources/templates/apps/business/contacts/embed/edit.html +++ b/contact-center/app/src/main/resources/templates/apps/business/contacts/embed/edit.html @@ -86,14 +86,14 @@
-
- +
@@ -166,11 +166,6 @@ var form = layui.form(); form.render(); //更新全部 form.verify({ - entphone: function(value){ - if(value!="" && !new RegExp(/^(0\d{2,3}-{0,1}\d{5,8}(-{0,1}\d{3,5}){0,1})|(((13[0-9])|(15([0-3]|[5-9]))|(18[0-9]))\d{8})$/).test(value)){ - return '请输入正确的电话号码'; - } - }, entemail: function(value){ if(value!="" && !new RegExp(/^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+/).test(value)){ return '请输入正确的电子邮箱地址'; diff --git a/contact-center/app/src/main/resources/templates/apps/business/customer/add.html b/contact-center/app/src/main/resources/templates/apps/business/customer/add.html index ff968a80..91808619 100644 --- a/contact-center/app/src/main/resources/templates/apps/business/customer/add.html +++ b/contact-center/app/src/main/resources/templates/apps/business/customer/add.html @@ -62,7 +62,7 @@
-
@@ -187,7 +187,7 @@
- +
@@ -204,12 +204,12 @@
- +
- +
@@ -233,37 +233,24 @@ diff --git a/contact-center/app/src/main/resources/templates/apps/business/customer/edit.html b/contact-center/app/src/main/resources/templates/apps/business/customer/edit.html index b9fa1b13..66fc4634 100644 --- a/contact-center/app/src/main/resources/templates/apps/business/customer/edit.html +++ b/contact-center/app/src/main/resources/templates/apps/business/customer/edit.html @@ -64,7 +64,7 @@
-
@@ -174,11 +174,6 @@ var form = layui.form(); form.render(); //更新全部 form.verify({ - entphone: function(value){ - if(value!="" && !new RegExp(/^(0\d{2,3}-{0,1}\d{5,8}(-{0,1}\d{3,5}){0,1})|(((13[0-9])|(15([0-3]|[5-9]))|(18[0,5-9]))\d{8})$/).test(value)){ - return '请输入正确的电话号码'; - } - }, entemail: function(value){ if(value!="" && !new RegExp(/^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+/).test(value)){ return '请输入正确的电子邮箱地址'; diff --git a/nginx/templates/ssl.conf b/nginx/templates/ssl.conf index 8589c5cf..a37a3e51 100644 --- a/nginx/templates/ssl.conf +++ b/nginx/templates/ssl.conf @@ -17,12 +17,18 @@ server { proxy_pass http://contact-center:8035; } - location /socket.io { proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection "Upgrade"; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header Host $host; - proxy_http_version 1.1; - proxy_pass http://contact-center:8036; + location /actuator { + return 403 "403: Target API is blocked."; + + } + + location /socket.io { + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "Upgrade"; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header Host $host; + proxy_http_version 1.1; + proxy_pass http://contact-center:8036; } } diff --git a/public/plugins/chatbot/classes/ApiChatbotController.java b/public/plugins/chatbot/classes/ApiChatbotController.java index 09b25b84..73cf531a 100644 --- a/public/plugins/chatbot/classes/ApiChatbotController.java +++ b/public/plugins/chatbot/classes/ApiChatbotController.java @@ -267,7 +267,7 @@ public class ApiChatbotController extends Handler { if (j.has("workmode") && Constants.CHATBOT_VALID_WORKMODELS.contains(j.get("workmode").getAsString())) { c.setWorkmode(j.get("workmode").getAsString()); - invite.setAifirst(StringUtils.equals(Constants.CHATBOT_CHATBOT_FIRST, c.getWorkmode())); + invite.setAifirst(!StringUtils.equals(Constants.CHATBOT_HUMAN_FIRST, c.getWorkmode())); } if (j.has("enabled")) { diff --git a/public/plugins/chatbot/views/apps/chatbot/edit.html b/public/plugins/chatbot/views/apps/chatbot/edit.html index d6dd232f..f769216c 100644 --- a/public/plugins/chatbot/views/apps/chatbot/edit.html +++ b/public/plugins/chatbot/views/apps/chatbot/edit.html @@ -52,6 +52,7 @@
来自访客的会话默认以什么方式接待
diff --git a/public/plugins/chatbot/views/apps/chatbot/index.html b/public/plugins/chatbot/views/apps/chatbot/index.html index 1895ca06..9918a110 100644 --- a/public/plugins/chatbot/views/apps/chatbot/index.html +++ b/public/plugins/chatbot/views/apps/chatbot/index.html @@ -118,7 +118,7 @@ ${currentbot.workmode} -

工作模式有机器人优先和人工坐席优先两种,这决定了访客连线后默认对接的方式。

+

工作模式有"机器人优先","人工坐席优先"和"仅机器人客服"三种,这决定了访客连线后默认对接的方式。