From 625ba344010b4efa42984980628393a44cb8240e Mon Sep 17 00:00:00 2001 From: Hai Liang Wang Date: Thu, 5 Aug 2021 20:45:13 +0800 Subject: [PATCH] https://github.com/chatopera/cskefu/issues/455 Fix session time period, upgrade chatopera sdk --- .../com/chatopera/cc/basic/Constants.java | 3 ++ .../com/chatopera/cc/model/FbMessenger.java | 19 +++++++++ .../resources/static/images/messenger.png | Bin 0 -> 3898 bytes .../config/sql/cosinee-MySQL-slim.sql | 4 +- ...009.alter_uk_agentservice_sessiontimes.sql | 6 +++ .../009.alter_uk_agentuser_sessiontimes.sql | 6 +++ contact-center/root/pom.xml | 2 +- .../chatbot/classes/ChatbotConstants.java | 2 + .../classes/ChatbotEventSubscription.java | 39 ++++++++++++++---- 9 files changed, 71 insertions(+), 10 deletions(-) create mode 100644 contact-center/app/src/main/resources/static/images/messenger.png create mode 100644 contact-center/config/sql/upgrade/009.alter_uk_agentservice_sessiontimes.sql create mode 100644 contact-center/config/sql/upgrade/009.alter_uk_agentuser_sessiontimes.sql 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 b3d6ab65..f9f00b19 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 @@ -131,6 +131,9 @@ public class Constants { public static final String AUDIT_AGENT_MESSAGE = "cskefu.agent.audit"; // 机器人返回的结果数据来源为faq public final static String PROVIDER_FAQ = "faq"; + public final static String PROVIDER_FEEDBACK = "feedback"; + public final static String PROVIDER_FEEDBACK_EVAL_POSITIVE = "positive"; + public final static String PROVIDER_FEEDBACK_EVAL_NEGATIVE = "negative"; // Facebook OTN 发送 public final static String INSTANT_MESSAGING_MQ_QUEUE_FACEBOOK_OTN = "cskefu.outbound.faceboot.otn"; diff --git a/contact-center/app/src/main/java/com/chatopera/cc/model/FbMessenger.java b/contact-center/app/src/main/java/com/chatopera/cc/model/FbMessenger.java index e735f4ea..ab2f3715 100644 --- a/contact-center/app/src/main/java/com/chatopera/cc/model/FbMessenger.java +++ b/contact-center/app/src/main/java/com/chatopera/cc/model/FbMessenger.java @@ -16,11 +16,14 @@ package com.chatopera.cc.model; +import com.alibaba.fastjson.JSONObject; +import org.apache.commons.lang.StringUtils; import org.hibernate.annotations.GenericGenerator; import javax.persistence.*; import java.io.Serializable; import java.util.Date; +import java.util.Map; @Entity @Table(name = "cs_fb_messenger") @@ -151,7 +154,23 @@ public class FbMessenger implements Serializable { return config; } + /** + * Get config as map object + * + * @return + */ + public Map parseConfigMap() { + Map configMap = (Map) JSONObject.parse(StringUtils.isNotBlank(getConfig()) ? getConfig() : "{}"); + return configMap; + } + public void setConfig(String config) { this.config = config; } + + public void setConfigMap(Map config) { + String data = JSONObject.toJSONString(config); + this.config = data; + } + } diff --git a/contact-center/app/src/main/resources/static/images/messenger.png b/contact-center/app/src/main/resources/static/images/messenger.png new file mode 100644 index 0000000000000000000000000000000000000000..00082f03d1cc6d2d0be3a28c2b32859563cf7cb7 GIT binary patch literal 3898 zcmY*ccRZVG*iK^a6`N9(;Xn$)QkMU#~AIEX^Z=@*!{^wW%`lE)I(EP_w%0d@nU5|mu&-fAv0AS%c z2_PV^K;YQzk{8+`(81gchVvyTySe*fJ(NQUekWA`cqr_c5Ino z?3kaVArj)hB!NCU5)S58;un1bJj6AXRg_gEbeYA)#o+<&S70^>!{6n{I~@spV4xoi z0tpETQ4Tq)>>J<-QH4UG5EV6unwrwFLWvYc40H=sB9bKkHThp3ga-*1;N=(Su(=mgq8AyP|ONk zsY2eInPrH6x$%FJ$=NxYKHg|K&BT_hVAqh1y@Sy=8@j<8>s=um6RWWNjf2JT=g;?x zrwgE@=}WcJUr>SRO$E>FgR-}_9$x1k(0)D_agRUm{xquC{LqX&`*v7xhNn@r80FnS zkk~-x_g#_cfT4ZXb96=g!yNeyZHxI}C&nc%)44997CfmJQq~Ou*z5lQJp(Df;2Axw zW~8u;cFWu>jPuQC?-pb?)9ULOXbX>>50NhMiFh?qQHcZ<(_%KRrg@m?PaoU|?)WFV zzG&>76}N1<@$D3_?gMi(%k?1*-O0l4M0=e{du-I_YFuJDCP8aGf$KdL(tbM>EAwI3 z8_a*e!Ld@DN7Fe`NoaNN7jHe7o>A=Jwef9Y4_E4AbO#1VmxEi->3jd6Q-5Aywc?0g zrr86VX{@v!jeW5Yrmj7h5{*e2vHP|_tW*_NNTYd2XQX$@=KZMtpdq8DG9DZK#$YWy6tpVB-b>kevilWM`FGLuaL8*!Obw))dhvZ~JHV8?x z5%!awIn|Rnv|#vB7Df+E|B5cVCVVBwaBIEMC1es&;#2#bSj{f7yy;q6F1*IOC)=R? zwl{gR4B4DyIIfUq(4q2D4kzXv*+GBq{hIH^rs94{6M~w95rI%O{?+Tc)GVSL&-9I-KF6n}=Q(CC#ZtC&QhE%8yDn&9stE&fSt{z`3Rs8rBJI57^e>DX<p$hL`CtbqBlj@<~ecAUAuqdd@2hDv8*?G&czmH~$03G0j|ndqSlHZJcj@a*vx2+S&4 zL@OPj+#OEQ%tm19=7(CDRNjHakve&v0+dhSel2d5XxlR-aUv+EW{WgT4}I?(uvUHD zig8nYf-79lZkHjk(0C$aMx|sT;&$myI7SJ#-N;OdNC_tF2-*JLN)^Rl~T-Qne-fy=APi9$3G%G*6=befMyXu6_?#t-^o$ z5#x=>K>_}Aim&x)W!*AOVt9kL0%o@f;$F@NFff|byW)}59PivznpuN#5n1~(E^581O z(azEgmdhdPjky!FmKN{l{ORmQri9b0*6D}*Ys4dqj{c;ahqZpvCSBZqs#DE8L-&|p z+f0`T$>NrT7HYSw;wMe_9zo?Y7`;aPht3a8vVT(5Ub_~YFAQ)O4p5*9--1N{WIXh4 znc%U7v!dvg;u8fywJVW$PRSc|hH?!L3cIrr1wS%u4W)IqcABIjSg(fyrA!{D@tf-q zv~Hh15Wd#QPnEr8V}vw;9uZ-4(Tx$}gHm5~N=Rhvn&{$-Zw@w>!bk(Q(l8BZs|agX z1*7I$@U?|^<*^GzU81t%>(|L9E@_fupWoh5V!0|q)=9piD3kUrqWXyKXIke35Dcjmtr`v3GnF>fUFrfRUs_^I@lZF3FL`cc^< zEzFu1_-#B#P0B`TPbJ4}+rl_XSl^%FiO3D=I3%x9Zff8MMFBbqwf<5?dfsMPHxix< z=Uz+E9I)OE5vAV@_YB)ITsg2!6($mSuxWt*RX{98EFPEYyKt(15gUh;%^_eJ*j!Ya| zI~5ioD4Nkdm?QkMy1&35E2MX^#+QSrKhMvjfyCd@PHjgtB z(l0;g->$eoxj()Q+;Kxd_|OUDXow7jaek6)3*ek;<)xOPF-A+foqkoi*%*yzDr08p zBeFrhO}1vMjlzUnANQ~EmVi>N?aS&pT1dWMOkOQPcJ316$S~0dBp`Y zeP^2{O;RwS75}13ne$#ht8{=}W8H=J0&URqAPoXEQt#}Dn(pCJKhN;u zn~&uBy~(>x3jIlX1}an*$d7A6#=|c>_$nE+v9Ao063y3F0??gh>~hsuw`1j=GLW;KmE z?^WRahb|#p=T>A)o6RG+iVj-;uA^D7yW6;#Si=|YTJLGy~5&V0|f$qY-xsk z{kOSE>zk^bpZo}&OZ=gsSSM4FuQBe@RZPQs+!jJe4RDhD(4tlT9oE`n1>;%EDO-Jy z+GLs*N!90NxEbBpu1FY}H!Y|)IqM(tw(zabyMvDOMHW>^S_p?Cj@!zn{^8vYhdxEX zYSD+JY=9ZQ?#YKmKF~PQ>`lehGc|>FXB@qdGTY`xT{VTT8j#_H0PoFvJwR4(a9MWaUN~mE1J4Uw`&cNveN+15LSN-8ppn<-)94;M%Tl5x-6!~0v4Jc*YS^B2 z*LX4IRPO2ajP~AVyI-tdx|LBn57RrkB92TcVYmKL1S#0Xbya_MBTWwhZ{&!1RACTX zAIM#R8FNmOWfCpd9kw3j(6gh9=a-%J@lHmiT{77`&X${I`)j&0-$XFQl{XPTRTvId z+0<_8dySdoihKaMSKP`c@6faqN8D%8KAdGs9r}(lKniH{Y%(?o!Mu8qbKY2!H)+PH z<)w=}*ItTXh7bXSFP2iQGw0fNGE$E`1*BpraCvhMV_Ale?m{4P8!$F^qDdhIiq^aB z(xJuf_gO20P3zj({t9UC4RBEaLUstiSC>DySgn7Pybh`o*7?fA%Gmo{!5C@46MpkL mCr4Wu;`$vv2j7vBZ+a`KUofPa{FDD*0Mft$aqj{q`hNhT^}w9~ literal 0 HcmV?d00001 diff --git a/contact-center/config/sql/cosinee-MySQL-slim.sql b/contact-center/config/sql/cosinee-MySQL-slim.sql index 18c00c62..43348643 100644 --- a/contact-center/config/sql/cosinee-MySQL-slim.sql +++ b/contact-center/config/sql/cosinee-MySQL-slim.sql @@ -529,7 +529,7 @@ CREATE TABLE `uk_agentservice` ( `ipaddr` varchar(50) DEFAULT NULL COMMENT 'IP地址', `osname` varchar(100) DEFAULT NULL COMMENT '操作系统名称', `browser` varchar(100) DEFAULT NULL COMMENT '浏览器', - `sessiontimes` int(20) DEFAULT NULL COMMENT '会话时长', + `sessiontimes` bigint(64) DEFAULT NULL COMMENT '会话时长', `servicetime` datetime DEFAULT NULL COMMENT '服务时长', `region` varchar(255) DEFAULT NULL COMMENT '区域', `agentusername` varchar(50) DEFAULT NULL COMMENT '坐席用户名', @@ -666,7 +666,7 @@ CREATE TABLE `uk_agentuser` ( `ipaddr` varchar(50) DEFAULT NULL COMMENT 'IP地址', `osname` varchar(100) DEFAULT NULL COMMENT '操作系统名称', `browser` varchar(100) DEFAULT NULL COMMENT '浏览器', - `sessiontimes` int(20) DEFAULT NULL COMMENT '会话时长', + `sessiontimes` bigint(64) DEFAULT NULL COMMENT '会话时长', `servicetime` datetime DEFAULT NULL COMMENT '服务次数', `region` varchar(255) DEFAULT NULL COMMENT '地区', `agentservice` varchar(32) DEFAULT NULL COMMENT '服务ID', diff --git a/contact-center/config/sql/upgrade/009.alter_uk_agentservice_sessiontimes.sql b/contact-center/config/sql/upgrade/009.alter_uk_agentservice_sessiontimes.sql new file mode 100644 index 00000000..420c4bc4 --- /dev/null +++ b/contact-center/config/sql/upgrade/009.alter_uk_agentservice_sessiontimes.sql @@ -0,0 +1,6 @@ +USE `cosinee`; +-- ----------------- +-- prepare variables +-- ----------------- + +ALTER TABLE `uk_agentservice` MODIFY COLUMN `sessiontimes` BIGINT(64) NULL DEFAULT NULL COMMENT '会话时长'; diff --git a/contact-center/config/sql/upgrade/009.alter_uk_agentuser_sessiontimes.sql b/contact-center/config/sql/upgrade/009.alter_uk_agentuser_sessiontimes.sql new file mode 100644 index 00000000..13904372 --- /dev/null +++ b/contact-center/config/sql/upgrade/009.alter_uk_agentuser_sessiontimes.sql @@ -0,0 +1,6 @@ +USE `cosinee`; +-- ----------------- +-- prepare variables +-- ----------------- + +ALTER TABLE `uk_agentuser` MODIFY COLUMN `sessiontimes` BIGINT(64) NULL DEFAULT NULL COMMENT '会话时长'; diff --git a/contact-center/root/pom.xml b/contact-center/root/pom.xml index 0cdd8a07..d9b2668c 100644 --- a/contact-center/root/pom.xml +++ b/contact-center/root/pom.xml @@ -375,7 +375,7 @@ com.chatopera.bot sdk - 3.3.2 + 3.5.0 diff --git a/public/plugins/chatbot/classes/ChatbotConstants.java b/public/plugins/chatbot/classes/ChatbotConstants.java index 1cfd6222..3011a1f2 100644 --- a/public/plugins/chatbot/classes/ChatbotConstants.java +++ b/public/plugins/chatbot/classes/ChatbotConstants.java @@ -20,4 +20,6 @@ public class ChatbotConstants { public static final String THRESHOLD_FAQ_BEST_REPLY = "BOT_THRESHOLD_FAQ_BEST_REPLY"; public static final String THRESHOLD_FAQ_SUGG_REPLY = "BOT_THRESHOLD_FAQ_SUGG_REPLY"; public static final String DEFAULT_BOT_PROVIDER = "https://bot.chatopera.com"; + public static final String PROVIDER_FEEDBACK_EVAL_POSITIVE_REPLY_PLACEHOLDER = "${evaluationYesReply}"; + public static final String PROVIDER_FEEDBACK_EVAL_NEGATIVE_REPLY_PLACEHOLDER = "${evaluationNoReply}"; } diff --git a/public/plugins/chatbot/classes/ChatbotEventSubscription.java b/public/plugins/chatbot/classes/ChatbotEventSubscription.java index e405f087..c421056f 100644 --- a/public/plugins/chatbot/classes/ChatbotEventSubscription.java +++ b/public/plugins/chatbot/classes/ChatbotEventSubscription.java @@ -17,10 +17,10 @@ package com.chatopera.cc.plugins.chatbot; import com.chatopera.bot.exception.ChatbotException; +import com.chatopera.bot.sdk.Response; import com.chatopera.cc.basic.Constants; import com.chatopera.cc.basic.MainContext; import com.chatopera.cc.cache.Cache; -import com.chatopera.cc.controller.api.request.RestUtils; import com.chatopera.cc.model.Chatbot; import com.chatopera.cc.persistence.repository.AgentUserRepository; import com.chatopera.cc.persistence.repository.ChatMessageRepository; @@ -105,21 +105,29 @@ public class ChatbotEventSubscription { // Get response from Conversational Engine. com.chatopera.bot.sdk.Chatbot bot = new com.chatopera.bot.sdk.Chatbot( c.getClientId(), c.getSecret(), botServiceProvider); - JSONObject result = bot.conversation( - request.getUserid(), request.getMessage(), faqBestReplyThreshold, faqSuggReplyThreshold); + + + JSONObject body = new JSONObject(); + body.put("fromUserId", request.getUserid()); + body.put("textMessage", request.getMessage()); + body.put("faqBestReplyThreshold", faqBestReplyThreshold); + body.put("faqSuggReplyThreshold", faqSuggReplyThreshold); + Response result = bot.command("POST", "/conversation/query", body); // parse response if (result != null) { logger.info("[chat] chat response {}", result.toString()); - if (result.getInt(RestUtils.RESP_KEY_RC) == 0) { + if (result.getRc() == 0) { // reply - JSONObject data = result.getJSONObject("data"); + JSONObject data = (JSONObject) result.getData(); if (data.has("logic_is_fallback")) { ChatMessage resp = creatChatMessage(request, c); resp.setMessage(data.getString("string")); ChatMessage respHelp = new ChatMessage(); JSONArray respParams = new JSONArray(); if (!StringUtils.equals(MainContext.ChannelType.WEBIM.toString(), c.getChannel())) { + // 非 WEBIM 情况,比如 Facebook Messenger,使用下面的方法 + // 如果在更多渠道下,此处可能仅适应于 Messenger,那么宜将检测条件调整为 ChannelType.MESSENGER if (data.getBoolean("logic_is_fallback")) { if (!StringUtils.equals(Constants.CHATBOT_HUMAN_FIRST, c.getWorkmode())) { JSONArray faqReplies = data.getJSONArray("faq"); @@ -157,6 +165,20 @@ public class ChatbotEventSubscription { message.put("attachment", attachment); resp.setExpmsg(message.toString()); } + } else if (StringUtils.equals(Constants.PROVIDER_FEEDBACK, data.getJSONObject("service").get("provider").toString())) { + respHelp = null; + // 反馈回复内容 + String sentiment = data.getJSONObject("service").get("sentiment").toString(); + if (StringUtils.equals(Constants.PROVIDER_FEEDBACK_EVAL_POSITIVE, sentiment)) { + // 积极评价 + resp.setMessage(ChatbotConstants.PROVIDER_FEEDBACK_EVAL_POSITIVE_REPLY_PLACEHOLDER); + } else if (StringUtils.equals(Constants.PROVIDER_FEEDBACK_EVAL_NEGATIVE, sentiment)) { + // 消极评价 + resp.setMessage(ChatbotConstants.PROVIDER_FEEDBACK_EVAL_NEGATIVE_REPLY_PLACEHOLDER); + } else { + // no response + resp.setMessage("${leaveMeAlone}"); + } } else if (StringUtils.equals(Constants.PROVIDER_FAQ, data.getJSONObject("service").get("provider").toString())) { if (data.has("params")) { resp.setMessage(data.getJSONArray("params").getJSONObject(0).getString("content")); @@ -197,6 +219,7 @@ public class ChatbotEventSubscription { } } } else { + // 当前渠道为 WEBIM if (data.getBoolean("logic_is_fallback")) { // 兜底回复,检查FAQ JSONArray faqReplies = data.getJSONArray("faq"); @@ -221,11 +244,13 @@ public class ChatbotEventSubscription { // 更新聊天机器人累计值 updateAgentUserWithRespData(request.getUserid(), request.getOrgi(), data); - // 保存并发送 + // 保存并发送 if (MainContext.ChannelType.WEBIM.toString().equals(resp.getChannel())) { + // WEBIM 渠道 chatbotProxy.saveAndPublish(resp); } else { + // 其他渠道 chatMessageRes.save(resp); if (respParams.length() > 0) { for (int i = 0; i < respParams.length(); i++) { @@ -244,7 +269,7 @@ public class ChatbotEventSubscription { } } } else { - logger.warn("[chat] can not get expected response {}", result.toString()); + logger.warn("[chat] can not get expected response rc {}, error {}", result.getRc(), result.getError()); } }