From 919146c3fb482b33b868532d2bd5c1a3eb06818f Mon Sep 17 00:00:00 2001 From: Hai Liang Wang Date: Sun, 24 Nov 2019 11:32:22 +0800 Subject: [PATCH] #237 enable set thresholds for bot replies --- contact-center/app/pom.xml | 2 +- .../com/chatopera/cc/acd/ACDAgentService.java | 33 +- .../admin/channel/WebIMController.java | 1 + .../cc/controller/apps/IMController.java | 27 +- .../com/chatopera/cc/model/CousultInvite.java | 1614 +++++++++-------- .../data/templates/contacts_template.xls | Bin 26112 -> 26112 bytes .../templates/admin/webim/index.html | 12 +- .../templates/admin/webim/profile.html | 13 + .../templates/apps/agent/agentusers.html | 2 +- .../resources/templates/apps/agent/index.html | 8 + .../templates/apps/cca/agentusers.html | 2 +- .../resources/templates/apps/cca/index.html | 8 + .../templates/apps/desktop/index.html | 5 +- .../resources/templates/apps/im/point.html | 84 +- .../templates/resource/css/ukefu.html | 5 + .../config/sql/cosinee-MySQL-slim.sql | 43 +- docker-compose.yml | 2 + .../chatbot/classes/ChatbotConstants.java | 2 + .../classes/ChatbotEventSubscription.java | 85 +- .../chatbot/classes/PluginDescriptor.java | 2 + sample.env | 4 +- 21 files changed, 1142 insertions(+), 812 deletions(-) diff --git a/contact-center/app/pom.xml b/contact-center/app/pom.xml index 006b67aa..5dad61a2 100644 --- a/contact-center/app/pom.xml +++ b/contact-center/app/pom.xml @@ -351,7 +351,7 @@ com.chatopera.bot sdk - 1.0.2 + 2.1.0 diff --git a/contact-center/app/src/main/java/com/chatopera/cc/acd/ACDAgentService.java b/contact-center/app/src/main/java/com/chatopera/cc/acd/ACDAgentService.java index 6b086897..46e461c2 100644 --- a/contact-center/app/src/main/java/com/chatopera/cc/acd/ACDAgentService.java +++ b/contact-center/app/src/main/java/com/chatopera/cc/acd/ACDAgentService.java @@ -182,10 +182,17 @@ public class ACDAgentService { } // 获得所有待服务访客的列表 - Map pendingAgentUsers = cache.getAgentUsersInQueByOrgi(orgi); + final Map pendingAgentUsers = cache.getAgentUsersInQueByOrgi(orgi); final SessionConfig sessionConfig = acdPolicyService.initSessionConfig(orgi); // 本次批量分配访客数目 int assigned = 0; + int currentAssigned = cache.getInservAgentUsersSizeByAgentnoAndOrgi( + agentStatus.getAgentno(), agentStatus.getOrgi()); + + logger.info( + "[assignVisitors] agentno {}, name {}, current assigned {}, batch size in queue {}", + agentStatus.getAgentno(), + agentStatus.getUsername(), currentAssigned, pendingAgentUsers.size()); for (Map.Entry entry : pendingAgentUsers.entrySet()) { AgentUser agentUser = entry.getValue(); @@ -202,20 +209,16 @@ public class ACDAgentService { StringUtils.isBlank(agentUser.getSkill()))) { // 待服务的访客还没有指定坐席,并且也没有绑定技能组 process = true; - } else { - if (StringUtils.isBlank(agentUser.getAgentno()) && - agentStatus.getSkills().containsKey(agentUser.getSkill())) { - // 待服务的访客还没有指定坐席,并且指定的技能组和该坐席的技能组一致 - process = true; - } - } - } else { - // 目标坐席没有状态,或该目标坐席有状态但是没有属于任何一个技能组 - if (StringUtils.isBlank(agentUser.getAgentno()) && - StringUtils.isBlank(agentUser.getSkill())) { - // 待服务访客没有指定坐席,并且没有指定技能组 + } else if (StringUtils.isBlank(agentUser.getAgentno()) && + agentStatus.getSkills().containsKey(agentUser.getSkill())) { + // 待服务的访客还没有指定坐席,并且指定的技能组和该坐席的技能组一致 process = true; } + } else if (StringUtils.isBlank(agentUser.getAgentno()) && + StringUtils.isBlank(agentUser.getSkill())) { + // 目标坐席没有状态,或该目标坐席有状态但是没有属于任何一个技能组 + // 待服务访客没有指定坐席,并且没有指定技能组 + process = true; } if (!process) { @@ -223,14 +226,14 @@ public class ACDAgentService { } // 坐席未达到最大咨询访客数量,并且单次批量分配小于坐席就绪时分配最大访客数量(initMaxuser) - if (((agentStatus.getUsers() + assigned) < sessionConfig.getMaxuser()) && (assigned < sessionConfig.getInitmaxuser())) { + if (((currentAssigned + assigned) < sessionConfig.getMaxuser()) && (assigned < sessionConfig.getInitmaxuser())) { assigned++; pickupAgentUserInQueue(agentUser, agentStatus); } else { logger.info( "[assignVisitors] agentno {} reach the max users limit {}/{} or batch assign limit {}/{}", agentno, - (agentStatus.getUsers() + assigned), + (currentAssigned + assigned), sessionConfig.getMaxuser(), assigned, sessionConfig.getInitmaxuser()); break; } diff --git a/contact-center/app/src/main/java/com/chatopera/cc/controller/admin/channel/WebIMController.java b/contact-center/app/src/main/java/com/chatopera/cc/controller/admin/channel/WebIMController.java index b880c8d1..1c73cf04 100644 --- a/contact-center/app/src/main/java/com/chatopera/cc/controller/admin/channel/WebIMController.java +++ b/contact-center/app/src/main/java/com/chatopera/cc/controller/admin/channel/WebIMController.java @@ -222,6 +222,7 @@ public class WebIMController extends Handler { tempInviteData.setMaxwordsnum(inviteData.getMaxwordsnum()); tempInviteData.setCtrlenter(inviteData.isCtrlenter()); + tempInviteData.setWhitelist_mode(inviteData.isWhitelist_mode()); if (dialogad != null && StringUtils.isNotBlank(dialogad.getName()) && dialogad.getBytes() != null && dialogad.getBytes().length > 0) { tempInviteData.setDialog_ad(super.saveImageFileWithMultipart(dialogad)); 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 99a0fe1a..13cafd1e 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 @@ -48,6 +48,7 @@ import org.springframework.util.FileCopyUtils; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; @@ -325,9 +326,10 @@ public class IMController extends Handler { } } - @RequestMapping("/userinformation") - @Menu(type = "im", subtype = "userinformation") - public ModelAndView userinformation( + @ResponseBody + @RequestMapping("/chatoperainit") + @Menu(type = "im", subtype = "chatoperainit") + public String chatoperaInit( ModelMap map, HttpServletRequest request, HttpServletResponse response, @@ -338,6 +340,7 @@ public class IMController extends Handler { String company_name, String sid, String system_name, + Boolean whitelist_mode, @RequestParam String sessionid) throws IOException, TemplateException { ModelAndView view = request(super.createRequestPageTempletResponse("/apps/im/point")); final User logined = super.getUser(request); @@ -364,11 +367,19 @@ public class IMController extends Handler { onlineUserRes.save(onlineUser); } - createContacts(userid, - request, - logined.getId(), - uid, cid, sid, username, company_name, system_name); - return view; + Contacts usc = contactsRes.findOneByWluidAndWlsidAndWlcid(uid, sid, cid); + if (usc != null) { + return "usc"; + } else { + if (!whitelist_mode) { + createContacts(userid, + request, + logined.getId(), + uid, cid, sid, username, company_name, system_name); + } + } + + return "ok"; } diff --git a/contact-center/app/src/main/java/com/chatopera/cc/model/CousultInvite.java b/contact-center/app/src/main/java/com/chatopera/cc/model/CousultInvite.java index e3bb4aab..6b397b75 100644 --- a/contact-center/app/src/main/java/com/chatopera/cc/model/CousultInvite.java +++ b/contact-center/app/src/main/java/com/chatopera/cc/model/CousultInvite.java @@ -24,718 +24,916 @@ import java.util.Date; @Entity @Table(name = "uk_consult_invite") @org.hibernate.annotations.Proxy(lazy = false) -public class CousultInvite implements java.io.Serializable{ - - /** - * - */ - private static final long serialVersionUID = 4067131780773572811L; - private String id; - private String impid; - private String orgi; - private String owner; - private String processid; - private String shares; - private Date update_time; - private String update_user; - private String username; - private String wfstatus; - private boolean consult_invite_enable; //启用邀请框 - private String consult_invite_model; - private String consult_invite_content; - private String consult_invite_accept ; //显示接收咨询按钮的文本 - private String consult_invite_later ; //显示稍后咨询的按钮 - private int consult_invite_delay ; //延时弹出邀请框 - private String consult_invite_bg ; //邀请框背景图片 - - private boolean ctrlenter ; //启用 CTRL+Enter发送消息 - - private String consult_invite_position; - private String consult_invite_color; - private String consult_invite_right; - private String consult_invite_left; - private String consult_invite_bottom; - private String consult_invite_top; - private Date create_time; - private String name; - private String consult_invite_width; - private String consult_invite_poptype; - private String consult_invite_fontsize; - private String consult_invite_fontstyle ; - private String consult_invite_fontcolor ; - private String consult_invite_interval; - private String consult_invite_repeat; - private String consult_invite_hight; - private String snsaccountid; - private String consult_vsitorbtn_position ; - private String consult_vsitorbtn_content ; - private String consult_vsitorbtn_right; - private String consult_vsitorbtn_left; - private String consult_vsitorbtn_top; - private String consult_vsitorbtn_color; - private String consult_vsitorbtn_model; - private String consult_vsitorbtn_bottom ; - private String consult_invite_backimg; +public class CousultInvite implements java.io.Serializable { - /** - * 技能组设置 - */ - private boolean consult_skill_fixed; // 是否绑定单一技能组 - private String consult_skill_fixed_id; // 绑定单一技能组,技能组ID - private String consult_skill_logo ; //显示技能组 logo - private String consult_skill_title ; //显示技能组标题 - private String consult_skill_img ; //显示技能组 图片 - private String consult_skill_msg ; //显示技能组 提示信息 - private int consult_skill_numbers ; //显示最大 分组数 - private int consult_skill_maxagent ; //每个技能组最多显示多少坐席 - private String consult_skill_bottomtitle ; //显示技能组底部标题 - private boolean consult_skill_agent ; //是否显示技能组下的坐席 - - private int consult_vsitorbtn_display ; - - private boolean recordhis ; //记录访客的网页访问记录 - private boolean traceuser; //实时追踪访客 - - private int maxwordsnum ; //允许访客端输入的最大文本字数 - - - private String consult_dialog_color; - private String consult_dialog_logo; - private String consult_dialog_headimg; - private String dialog_name ; - private String dialog_address; - private String dialog_phone; - private String dialog_mail ; - private String dialog_introduction; - private String dialog_message ; - private String dialog_ad ; - - private String lvmopentype ; //留言板弹出方式 - private boolean leavemessage ; //启用留言功能 - private boolean lvmname; - private boolean lvmphone; - private boolean lvmemail; - private boolean lvmaddress; - private boolean lvmqq; - private boolean lvmcontent = true; - private boolean skill ; //启用技能组功能 - - private boolean onlyareaskill ; //只显示地区技能组 , 无地区技能组是 提示消息,不显示公共技能组 - private String areaskilltipmsg ;//未配置地区技能组是提示消息 - - private boolean consult_info; //启用咨询信息收集功能 - private boolean consult_info_cookies; //启用Cookies存储用户录入的信息, 最长有效时间是 3600秒,超时需要重新填写 - private boolean consult_info_name;//填写姓名 - private boolean consult_info_email; //填写 邮件地址 - private boolean consult_info_phone;//填写 电话号码 - private boolean consult_info_resion; //填写咨询问题 - private String consult_info_message; //咨询窗口显示的欢迎语 - - private String agentshortcutkey ; //坐席回复快捷键 - private String usershortcutkey ; //访客快捷键 - - private boolean ai ; //是否启用 AI - private boolean aifirst ; //AI优先接入 - private boolean aisearch ; //AI允许使用 搜索引擎, 例如百度 等 - private String aimsg ; //AI欢迎信息,可以使用 HTML - private String aisuccesstip ;//AI服务连接成功的消息提示 - private String ainame ; //AI服务 昵称 - - private String aiid; //默认的机器人 - - private String datadept; - private String agent_online; + /** + * + */ + private static final long serialVersionUID = 4067131780773572811L; + private String id; + private String impid; + private String orgi; + private String owner; + private String processid; + private String shares; + private Date update_time; + private String update_user; + private String username; + private String wfstatus; + private boolean consult_invite_enable; //启用邀请框 + private String consult_invite_model; + private String consult_invite_content; + private String consult_invite_accept; //显示接收咨询按钮的文本 + private String consult_invite_later; //显示稍后咨询的按钮 + private int consult_invite_delay; //延时弹出邀请框 + private String consult_invite_bg; //邀请框背景图片 - - @Id - @Column(length = 32) - @GeneratedValue(generator = "system-uuid") - @GenericGenerator(name = "system-uuid", strategy = "uuid") - public String getId() { - return id; - } - public void setId(String id) { - this.id = id; - } - public String getImpid() { - return impid; - } - public void setImpid(String impid) { - this.impid = impid; - } - public String getOrgi() { - return orgi; - } - public void setOrgi(String orgi) { - this.orgi = orgi; - } - public String getOwner() { - return owner; - } - public void setOwner(String owner) { - this.owner = owner; - } - public String getProcessid() { - return processid; - } - public void setProcessid(String processid) { - this.processid = processid; - } - public String getShares() { - return shares; - } - public void setShares(String shares) { - this.shares = shares; - } - public Date getUpdate_time() { - return update_time; - } - public void setUpdate_time(Date update_time) { - this.update_time = update_time; - } - public String getUpdate_user() { - return update_user; - } - public void setUpdate_user(String update_user) { - this.update_user = update_user; - } - public String getUsername() { - return username; - } - public void setUsername(String username) { - this.username = username; - } - public String getWfstatus() { - return wfstatus; - } - public void setWfstatus(String wfstatus) { - this.wfstatus = wfstatus; - } - public String getConsult_invite_model() { - return consult_invite_model; - } - public void setConsult_invite_model(String consult_invite_model) { - this.consult_invite_model = consult_invite_model; - } - public String getConsult_invite_content() { - return consult_invite_content; - } - public void setConsult_invite_content(String consult_invite_content) { - this.consult_invite_content = consult_invite_content; - } - public String getConsult_invite_position() { - return consult_invite_position; - } - public void setConsult_invite_position(String consult_invite_position) { - this.consult_invite_position = consult_invite_position; - } - public String getConsult_invite_color() { - return consult_invite_color; - } - public void setConsult_invite_color(String consult_invite_color) { - this.consult_invite_color = consult_invite_color; - } - public String getConsult_invite_right() { - return consult_invite_right; - } - public void setConsult_invite_right(String consult_invite_right) { - this.consult_invite_right = consult_invite_right; - } - public String getConsult_invite_left() { - return consult_invite_left; - } - public void setConsult_invite_left(String consult_invite_left) { - this.consult_invite_left = consult_invite_left; - } - public String getConsult_invite_bottom() { - return consult_invite_bottom; - } - public void setConsult_invite_bottom(String consult_invite_bottom) { - this.consult_invite_bottom = consult_invite_bottom; - } - public String getConsult_invite_top() { - return consult_invite_top; - } - public void setConsult_invite_top(String consult_invite_top) { - this.consult_invite_top = consult_invite_top; - } - public Date getCreate_time() { - return create_time; - } - public void setCreate_time(Date create_time) { - this.create_time = create_time; - } - public String getName() { - return name; - } - public void setName(String name) { - this.name = name; - } - public String getConsult_invite_width() { - return consult_invite_width; - } - public void setConsult_invite_width(String consult_invite_width) { - this.consult_invite_width = consult_invite_width; - } - public String getConsult_invite_poptype() { - return consult_invite_poptype; - } - public void setConsult_invite_poptype(String consult_invite_poptype) { - this.consult_invite_poptype = consult_invite_poptype; - } - public String getConsult_invite_fontsize() { - return consult_invite_fontsize; - } - public void setConsult_invite_fontsize(String consult_invite_fontsize) { - this.consult_invite_fontsize = consult_invite_fontsize; - } - public String getConsult_invite_fontstyle() { - return consult_invite_fontstyle; - } - public void setConsult_invite_fontstyle(String consult_invite_fontstyle) { - this.consult_invite_fontstyle = consult_invite_fontstyle; - } - public String getConsult_invite_fontcolor() { - return consult_invite_fontcolor; - } - public void setConsult_invite_fontcolor(String consult_invite_fontcolor) { - this.consult_invite_fontcolor = consult_invite_fontcolor; - } - public String getConsult_invite_interval() { - return consult_invite_interval; - } - public void setConsult_invite_interval(String consult_invite_interval) { - this.consult_invite_interval = consult_invite_interval; - } - public String getConsult_invite_repeat() { - return consult_invite_repeat; - } - public void setConsult_invite_repeat(String consult_invite_repeat) { - this.consult_invite_repeat = consult_invite_repeat; - } - public String getConsult_invite_hight() { - return consult_invite_hight; - } - public void setConsult_invite_hight(String consult_invite_hight) { - this.consult_invite_hight = consult_invite_hight; - } - public String getSnsaccountid() { - return snsaccountid; - } - public void setSnsaccountid(String snsaccountid) { - this.snsaccountid = snsaccountid; - } - public String getConsult_vsitorbtn_position() { - return consult_vsitorbtn_position; - } - public void setConsult_vsitorbtn_position(String consult_vsitorbtn_position) { - this.consult_vsitorbtn_position = consult_vsitorbtn_position; - } - public String getConsult_vsitorbtn_content() { - return consult_vsitorbtn_content; - } - public void setConsult_vsitorbtn_content(String consult_vsitorbtn_content) { - this.consult_vsitorbtn_content = consult_vsitorbtn_content; - } - public String getConsult_vsitorbtn_right() { - return consult_vsitorbtn_right; - } - public void setConsult_vsitorbtn_right(String consult_vsitorbtn_right) { - this.consult_vsitorbtn_right = consult_vsitorbtn_right; - } - public String getConsult_vsitorbtn_left() { - return consult_vsitorbtn_left; - } - public void setConsult_vsitorbtn_left(String consult_vsitorbtn_left) { - this.consult_vsitorbtn_left = consult_vsitorbtn_left; - } - public String getConsult_vsitorbtn_top() { - return consult_vsitorbtn_top; - } - public void setConsult_vsitorbtn_top(String consult_vsitorbtn_top) { - this.consult_vsitorbtn_top = consult_vsitorbtn_top; - } - public String getConsult_vsitorbtn_color() { - return consult_vsitorbtn_color; - } - public void setConsult_vsitorbtn_color(String consult_vsitorbtn_color) { - this.consult_vsitorbtn_color = consult_vsitorbtn_color; - } - public String getConsult_vsitorbtn_model() { - return consult_vsitorbtn_model; - } - public void setConsult_vsitorbtn_model(String consult_vsitorbtn_model) { - this.consult_vsitorbtn_model = consult_vsitorbtn_model; - } - public String getConsult_vsitorbtn_bottom() { - return consult_vsitorbtn_bottom; - } - public void setConsult_vsitorbtn_bottom(String consult_vsitorbtn_bottom) { - this.consult_vsitorbtn_bottom = consult_vsitorbtn_bottom; - } - public String getConsult_invite_backimg() { - return consult_invite_backimg; - } - public void setConsult_invite_backimg(String consult_invite_backimg) { - this.consult_invite_backimg = consult_invite_backimg; - } - public String getDatadept() { - return datadept; - } - public void setDatadept(String datadept) { - this.datadept = datadept; - } - public String getAgent_online() { - return agent_online; - } - public void setAgent_online(String agent_online) { - this.agent_online = agent_online; - } - public String getConsult_dialog_color() { - return consult_dialog_color; - } - public void setConsult_dialog_color(String consult_dialog_color) { - this.consult_dialog_color = consult_dialog_color; - } - public String getConsult_dialog_logo() { - return consult_dialog_logo; - } - public void setConsult_dialog_logo(String consult_dialog_logo) { - this.consult_dialog_logo = consult_dialog_logo; - } - public String getConsult_dialog_headimg() { - return consult_dialog_headimg; - } - public void setConsult_dialog_headimg(String consult_dialog_headimg) { - this.consult_dialog_headimg = consult_dialog_headimg; - } - public int getConsult_vsitorbtn_display() { - return consult_vsitorbtn_display; - } - public void setConsult_vsitorbtn_display(int consult_vsitorbtn_display) { - this.consult_vsitorbtn_display = consult_vsitorbtn_display; - } - public String getDialog_name() { - return dialog_name; - } - public void setDialog_name(String dialog_name) { - this.dialog_name = dialog_name; - } - public String getDialog_address() { - return dialog_address; - } - public void setDialog_address(String dialog_address) { - this.dialog_address = dialog_address; - } - public String getDialog_phone() { - return dialog_phone; - } - public void setDialog_phone(String dialog_phone) { - this.dialog_phone = dialog_phone; - } - public String getDialog_mail() { - return dialog_mail; - } - public void setDialog_mail(String dialog_mail) { - this.dialog_mail = dialog_mail; - } - public String getDialog_introduction() { - return dialog_introduction; - } - public void setDialog_introduction(String dialog_introduction) { - this.dialog_introduction = dialog_introduction; - } - public String getDialog_message() { - return dialog_message; - } - public void setDialog_message(String dialog_message) { - this.dialog_message = dialog_message; - } - public String getDialog_ad() { - return dialog_ad; - } - public void setDialog_ad(String dialog_ad) { - this.dialog_ad = dialog_ad; - } - public boolean isConsult_invite_enable() { - return consult_invite_enable; - } - public void setConsult_invite_enable(boolean consult_invite_enable) { - this.consult_invite_enable = consult_invite_enable; - } - public String getConsult_invite_accept() { - return consult_invite_accept; - } - public void setConsult_invite_accept(String consult_invite_accept) { - this.consult_invite_accept = consult_invite_accept; - } - public String getConsult_invite_later() { - return consult_invite_later; - } - public void setConsult_invite_later(String consult_invite_later) { - this.consult_invite_later = consult_invite_later; - } - public int getConsult_invite_delay() { - return consult_invite_delay; - } - public void setConsult_invite_delay(int consult_invite_delay) { - this.consult_invite_delay = consult_invite_delay; - } - public String getConsult_invite_bg() { - return consult_invite_bg; - } - public void setConsult_invite_bg(String consult_invite_bg) { - this.consult_invite_bg = consult_invite_bg; - } - public boolean isLeavemessage() { - return leavemessage; - } - public void setLeavemessage(boolean leavemessage) { - this.leavemessage = leavemessage; - } - public boolean isLvmname() { - return lvmname; - } - public void setLvmname(boolean lvmname) { - this.lvmname = lvmname; - } - public boolean isLvmphone() { - return lvmphone; - } - public void setLvmphone(boolean lvmphone) { - this.lvmphone = lvmphone; - } - public boolean isLvmemail() { - return lvmemail; - } - public void setLvmemail(boolean lvmemail) { - this.lvmemail = lvmemail; - } - public boolean isLvmaddress() { - return lvmaddress; - } - public void setLvmaddress(boolean lvmaddress) { - this.lvmaddress = lvmaddress; - } - public boolean isLvmcontent() { - return lvmcontent; - } - public void setLvmcontent(boolean lvmcontent) { - this.lvmcontent = lvmcontent; - } - public String getLvmopentype() { - return lvmopentype; - } - public void setLvmopentype(String lvmopentype) { - this.lvmopentype = lvmopentype; - } - public boolean isSkill() { - return skill; - } - public void setSkill(boolean skill) { - this.skill = skill; - } - - public boolean isLvmqq() { - return lvmqq; - } - public void setLvmqq(boolean lvmqq) { - this.lvmqq = lvmqq; - } - public String getConsult_skill_logo() { - return consult_skill_logo; - } - public void setConsult_skill_logo(String consult_skill_logo) { - this.consult_skill_logo = consult_skill_logo; - } - public String getConsult_skill_title() { - return consult_skill_title; - } - public void setConsult_skill_title(String consult_skill_title) { - this.consult_skill_title = consult_skill_title; - } - public String getConsult_skill_img() { - return consult_skill_img; - } - public void setConsult_skill_img(String consult_skill_img) { - this.consult_skill_img = consult_skill_img; - } - public String getConsult_skill_msg() { - return consult_skill_msg; - } - public void setConsult_skill_msg(String consult_skill_msg) { - this.consult_skill_msg = consult_skill_msg; - } - public int getConsult_skill_numbers() { - return consult_skill_numbers; - } - public void setConsult_skill_numbers(int consult_skill_numbers) { - this.consult_skill_numbers = consult_skill_numbers; - } - public int getConsult_skill_maxagent() { - return consult_skill_maxagent; - } - public void setConsult_skill_maxagent(int consult_skill_maxagent) { - this.consult_skill_maxagent = consult_skill_maxagent; - } - public String getConsult_skill_bottomtitle() { - return consult_skill_bottomtitle; - } - public void setConsult_skill_bottomtitle(String consult_skill_bottomtitle) { - this.consult_skill_bottomtitle = consult_skill_bottomtitle; - } - public boolean isAi() { - return ai; - } - public void setAi(boolean ai) { - this.ai = ai; - } - public boolean isAifirst() { - return aifirst; - } - public void setAifirst(boolean aifirst) { - this.aifirst = aifirst; - } - public boolean isAisearch() { - return aisearch; - } - public void setAisearch(boolean aisearch) { - this.aisearch = aisearch; - } - public String getAimsg() { - return aimsg; - } - public void setAimsg(String aimsg) { - this.aimsg = aimsg; - } - public String getAisuccesstip() { - return aisuccesstip; - } - public void setAisuccesstip(String aisuccesstip) { - this.aisuccesstip = aisuccesstip; - } - public String getAiname() { - return ainame; - } - public void setAiname(String ainame) { - this.ainame = ainame; - } - public boolean isConsult_info() { - return consult_info; - } - public void setConsult_info(boolean consult_info) { - this.consult_info = consult_info; - } - public boolean isConsult_info_name() { - return consult_info_name; - } - public void setConsult_info_name(boolean consult_info_name) { - this.consult_info_name = consult_info_name; - } - public boolean isConsult_info_email() { - return consult_info_email; - } - public void setConsult_info_email(boolean consult_info_email) { - this.consult_info_email = consult_info_email; - } - public boolean isConsult_info_phone() { - return consult_info_phone; - } - public void setConsult_info_phone(boolean consult_info_phone) { - this.consult_info_phone = consult_info_phone; - } - public boolean isConsult_info_resion() { - return consult_info_resion; - } - public void setConsult_info_resion(boolean consult_info_resion) { - this.consult_info_resion = consult_info_resion; - } - public String getConsult_info_message() { - return consult_info_message; - } - public void setConsult_info_message(String consult_info_message) { - this.consult_info_message = consult_info_message; - } - public boolean isConsult_info_cookies() { - return consult_info_cookies; - } - public void setConsult_info_cookies(boolean consult_info_cookies) { - this.consult_info_cookies = consult_info_cookies; - } - public boolean isRecordhis() { - return recordhis; - } - public void setRecordhis(boolean recordhis) { - this.recordhis = recordhis; - } - public boolean isTraceuser() { - return traceuser; - } - public void setTraceuser(boolean traceuser) { - this.traceuser = traceuser; - } - public boolean isConsult_skill_agent() { - return consult_skill_agent; - } - public void setConsult_skill_agent(boolean consult_skill_agent) { - this.consult_skill_agent = consult_skill_agent; - } - public boolean isOnlyareaskill() { - return onlyareaskill; - } - public void setOnlyareaskill(boolean onlyareaskill) { - this.onlyareaskill = onlyareaskill; - } - public String getAreaskilltipmsg() { - return areaskilltipmsg; - } - public void setAreaskilltipmsg(String areaskilltipmsg) { - this.areaskilltipmsg = areaskilltipmsg; - } - public String getAiid() { - return aiid; - } - public void setAiid(String aiid) { - this.aiid = aiid; - } - public int getMaxwordsnum() { - return maxwordsnum; - } - public void setMaxwordsnum(int maxwordsnum) { - this.maxwordsnum = maxwordsnum; - } - public String getAgentshortcutkey() { - return agentshortcutkey; - } - public void setAgentshortcutkey(String agentshortcutkey) { - this.agentshortcutkey = agentshortcutkey; - } - public String getUsershortcutkey() { - return usershortcutkey; - } - public void setUsershortcutkey(String usershortcutkey) { - this.usershortcutkey = usershortcutkey; - } - public boolean isCtrlenter() { - return ctrlenter; - } - public void setCtrlenter(boolean ctrlenter) { - this.ctrlenter = ctrlenter; - } + private boolean ctrlenter; //启用 CTRL+Enter发送消息 - public boolean isConsult_skill_fixed() { - return consult_skill_fixed; - } + private boolean whitelist_mode; - public void setConsult_skill_fixed(boolean consult_skill_fixed) { - this.consult_skill_fixed = consult_skill_fixed; - } + private String consult_invite_position; + private String consult_invite_color; + private String consult_invite_right; + private String consult_invite_left; + private String consult_invite_bottom; + private String consult_invite_top; + private Date create_time; + private String name; + private String consult_invite_width; + private String consult_invite_poptype; + private String consult_invite_fontsize; + private String consult_invite_fontstyle; + private String consult_invite_fontcolor; + private String consult_invite_interval; + private String consult_invite_repeat; + private String consult_invite_hight; + private String snsaccountid; + private String consult_vsitorbtn_position; + private String consult_vsitorbtn_content; + private String consult_vsitorbtn_right; + private String consult_vsitorbtn_left; + private String consult_vsitorbtn_top; + private String consult_vsitorbtn_color; + private String consult_vsitorbtn_model; + private String consult_vsitorbtn_bottom; + private String consult_invite_backimg; - public String getConsult_skill_fixed_id() { - return consult_skill_fixed_id; - } + /** + * 技能组设置 + */ + private boolean consult_skill_fixed; // 是否绑定单一技能组 + private String consult_skill_fixed_id; // 绑定单一技能组,技能组ID + private String consult_skill_logo; //显示技能组 logo + private String consult_skill_title; //显示技能组标题 + private String consult_skill_img; //显示技能组 图片 + private String consult_skill_msg; //显示技能组 提示信息 + private int consult_skill_numbers; //显示最大 分组数 + private int consult_skill_maxagent; //每个技能组最多显示多少坐席 + private String consult_skill_bottomtitle; //显示技能组底部标题 + private boolean consult_skill_agent; //是否显示技能组下的坐席 - public void setConsult_skill_fixed_id(String consult_skill_fixed_id) { - this.consult_skill_fixed_id = consult_skill_fixed_id; - } + private int consult_vsitorbtn_display; + + private boolean recordhis; //记录访客的网页访问记录 + private boolean traceuser; //实时追踪访客 + + private int maxwordsnum; //允许访客端输入的最大文本字数 + + + private String consult_dialog_color; + private String consult_dialog_logo; + private String consult_dialog_headimg; + private String dialog_name; + private String dialog_address; + private String dialog_phone; + private String dialog_mail; + private String dialog_introduction; + private String dialog_message; + private String dialog_ad; + + private String lvmopentype; //留言板弹出方式 + private boolean leavemessage; //启用留言功能 + private boolean lvmname; + private boolean lvmphone; + private boolean lvmemail; + private boolean lvmaddress; + private boolean lvmqq; + private boolean lvmcontent = true; + private boolean skill; //启用技能组功能 + + private boolean onlyareaskill; //只显示地区技能组 , 无地区技能组是 提示消息,不显示公共技能组 + private String areaskilltipmsg;//未配置地区技能组是提示消息 + + private boolean consult_info; //启用咨询信息收集功能 + private boolean consult_info_cookies; //启用Cookies存储用户录入的信息, 最长有效时间是 3600秒,超时需要重新填写 + private boolean consult_info_name;//填写姓名 + private boolean consult_info_email; //填写 邮件地址 + private boolean consult_info_phone;//填写 电话号码 + private boolean consult_info_resion; //填写咨询问题 + private String consult_info_message; //咨询窗口显示的欢迎语 + + private String agentshortcutkey; //坐席回复快捷键 + private String usershortcutkey; //访客快捷键 + + private boolean ai; //是否启用 AI + private boolean aifirst; //AI优先接入 + private boolean aisearch; //AI允许使用 搜索引擎, 例如百度 等 + private String aimsg; //AI欢迎信息,可以使用 HTML + private String aisuccesstip;//AI服务连接成功的消息提示 + private String ainame; //AI服务 昵称 + + private String aiid; //默认的机器人 + + private String datadept; + private String agent_online; + + + @Id + @Column(length = 32) + @GeneratedValue(generator = "system-uuid") + @GenericGenerator(name = "system-uuid", strategy = "uuid") + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getImpid() { + return impid; + } + + public void setImpid(String impid) { + this.impid = impid; + } + + public String getOrgi() { + return orgi; + } + + public void setOrgi(String orgi) { + this.orgi = orgi; + } + + public String getOwner() { + return owner; + } + + public void setOwner(String owner) { + this.owner = owner; + } + + public String getProcessid() { + return processid; + } + + public void setProcessid(String processid) { + this.processid = processid; + } + + public String getShares() { + return shares; + } + + public void setShares(String shares) { + this.shares = shares; + } + + public Date getUpdate_time() { + return update_time; + } + + public void setUpdate_time(Date update_time) { + this.update_time = update_time; + } + + public String getUpdate_user() { + return update_user; + } + + public void setUpdate_user(String update_user) { + this.update_user = update_user; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getWfstatus() { + return wfstatus; + } + + public void setWfstatus(String wfstatus) { + this.wfstatus = wfstatus; + } + + public String getConsult_invite_model() { + return consult_invite_model; + } + + public void setConsult_invite_model(String consult_invite_model) { + this.consult_invite_model = consult_invite_model; + } + + public String getConsult_invite_content() { + return consult_invite_content; + } + + public void setConsult_invite_content(String consult_invite_content) { + this.consult_invite_content = consult_invite_content; + } + + public String getConsult_invite_position() { + return consult_invite_position; + } + + public void setConsult_invite_position(String consult_invite_position) { + this.consult_invite_position = consult_invite_position; + } + + public String getConsult_invite_color() { + return consult_invite_color; + } + + public void setConsult_invite_color(String consult_invite_color) { + this.consult_invite_color = consult_invite_color; + } + + public String getConsult_invite_right() { + return consult_invite_right; + } + + public void setConsult_invite_right(String consult_invite_right) { + this.consult_invite_right = consult_invite_right; + } + + public String getConsult_invite_left() { + return consult_invite_left; + } + + public void setConsult_invite_left(String consult_invite_left) { + this.consult_invite_left = consult_invite_left; + } + + public String getConsult_invite_bottom() { + return consult_invite_bottom; + } + + public void setConsult_invite_bottom(String consult_invite_bottom) { + this.consult_invite_bottom = consult_invite_bottom; + } + + public String getConsult_invite_top() { + return consult_invite_top; + } + + public void setConsult_invite_top(String consult_invite_top) { + this.consult_invite_top = consult_invite_top; + } + + public Date getCreate_time() { + return create_time; + } + + public void setCreate_time(Date create_time) { + this.create_time = create_time; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getConsult_invite_width() { + return consult_invite_width; + } + + public void setConsult_invite_width(String consult_invite_width) { + this.consult_invite_width = consult_invite_width; + } + + public String getConsult_invite_poptype() { + return consult_invite_poptype; + } + + public void setConsult_invite_poptype(String consult_invite_poptype) { + this.consult_invite_poptype = consult_invite_poptype; + } + + public String getConsult_invite_fontsize() { + return consult_invite_fontsize; + } + + public void setConsult_invite_fontsize(String consult_invite_fontsize) { + this.consult_invite_fontsize = consult_invite_fontsize; + } + + public String getConsult_invite_fontstyle() { + return consult_invite_fontstyle; + } + + public void setConsult_invite_fontstyle(String consult_invite_fontstyle) { + this.consult_invite_fontstyle = consult_invite_fontstyle; + } + + public String getConsult_invite_fontcolor() { + return consult_invite_fontcolor; + } + + public void setConsult_invite_fontcolor(String consult_invite_fontcolor) { + this.consult_invite_fontcolor = consult_invite_fontcolor; + } + + public String getConsult_invite_interval() { + return consult_invite_interval; + } + + public void setConsult_invite_interval(String consult_invite_interval) { + this.consult_invite_interval = consult_invite_interval; + } + + public String getConsult_invite_repeat() { + return consult_invite_repeat; + } + + public void setConsult_invite_repeat(String consult_invite_repeat) { + this.consult_invite_repeat = consult_invite_repeat; + } + + public String getConsult_invite_hight() { + return consult_invite_hight; + } + + public void setConsult_invite_hight(String consult_invite_hight) { + this.consult_invite_hight = consult_invite_hight; + } + + public String getSnsaccountid() { + return snsaccountid; + } + + public void setSnsaccountid(String snsaccountid) { + this.snsaccountid = snsaccountid; + } + + public String getConsult_vsitorbtn_position() { + return consult_vsitorbtn_position; + } + + public void setConsult_vsitorbtn_position(String consult_vsitorbtn_position) { + this.consult_vsitorbtn_position = consult_vsitorbtn_position; + } + + public String getConsult_vsitorbtn_content() { + return consult_vsitorbtn_content; + } + + public void setConsult_vsitorbtn_content(String consult_vsitorbtn_content) { + this.consult_vsitorbtn_content = consult_vsitorbtn_content; + } + + public String getConsult_vsitorbtn_right() { + return consult_vsitorbtn_right; + } + + public void setConsult_vsitorbtn_right(String consult_vsitorbtn_right) { + this.consult_vsitorbtn_right = consult_vsitorbtn_right; + } + + public String getConsult_vsitorbtn_left() { + return consult_vsitorbtn_left; + } + + public void setConsult_vsitorbtn_left(String consult_vsitorbtn_left) { + this.consult_vsitorbtn_left = consult_vsitorbtn_left; + } + + public String getConsult_vsitorbtn_top() { + return consult_vsitorbtn_top; + } + + public void setConsult_vsitorbtn_top(String consult_vsitorbtn_top) { + this.consult_vsitorbtn_top = consult_vsitorbtn_top; + } + + public String getConsult_vsitorbtn_color() { + return consult_vsitorbtn_color; + } + + public void setConsult_vsitorbtn_color(String consult_vsitorbtn_color) { + this.consult_vsitorbtn_color = consult_vsitorbtn_color; + } + + public String getConsult_vsitorbtn_model() { + return consult_vsitorbtn_model; + } + + public void setConsult_vsitorbtn_model(String consult_vsitorbtn_model) { + this.consult_vsitorbtn_model = consult_vsitorbtn_model; + } + + public String getConsult_vsitorbtn_bottom() { + return consult_vsitorbtn_bottom; + } + + public void setConsult_vsitorbtn_bottom(String consult_vsitorbtn_bottom) { + this.consult_vsitorbtn_bottom = consult_vsitorbtn_bottom; + } + + public String getConsult_invite_backimg() { + return consult_invite_backimg; + } + + public void setConsult_invite_backimg(String consult_invite_backimg) { + this.consult_invite_backimg = consult_invite_backimg; + } + + public String getDatadept() { + return datadept; + } + + public void setDatadept(String datadept) { + this.datadept = datadept; + } + + public String getAgent_online() { + return agent_online; + } + + public void setAgent_online(String agent_online) { + this.agent_online = agent_online; + } + + public String getConsult_dialog_color() { + return consult_dialog_color; + } + + public void setConsult_dialog_color(String consult_dialog_color) { + this.consult_dialog_color = consult_dialog_color; + } + + public String getConsult_dialog_logo() { + return consult_dialog_logo; + } + + public void setConsult_dialog_logo(String consult_dialog_logo) { + this.consult_dialog_logo = consult_dialog_logo; + } + + public String getConsult_dialog_headimg() { + return consult_dialog_headimg; + } + + public void setConsult_dialog_headimg(String consult_dialog_headimg) { + this.consult_dialog_headimg = consult_dialog_headimg; + } + + public int getConsult_vsitorbtn_display() { + return consult_vsitorbtn_display; + } + + public void setConsult_vsitorbtn_display(int consult_vsitorbtn_display) { + this.consult_vsitorbtn_display = consult_vsitorbtn_display; + } + + public String getDialog_name() { + return dialog_name; + } + + public void setDialog_name(String dialog_name) { + this.dialog_name = dialog_name; + } + + public String getDialog_address() { + return dialog_address; + } + + public void setDialog_address(String dialog_address) { + this.dialog_address = dialog_address; + } + + public String getDialog_phone() { + return dialog_phone; + } + + public void setDialog_phone(String dialog_phone) { + this.dialog_phone = dialog_phone; + } + + public String getDialog_mail() { + return dialog_mail; + } + + public void setDialog_mail(String dialog_mail) { + this.dialog_mail = dialog_mail; + } + + public String getDialog_introduction() { + return dialog_introduction; + } + + public void setDialog_introduction(String dialog_introduction) { + this.dialog_introduction = dialog_introduction; + } + + public String getDialog_message() { + return dialog_message; + } + + public void setDialog_message(String dialog_message) { + this.dialog_message = dialog_message; + } + + public String getDialog_ad() { + return dialog_ad; + } + + public void setDialog_ad(String dialog_ad) { + this.dialog_ad = dialog_ad; + } + + public boolean isConsult_invite_enable() { + return consult_invite_enable; + } + + public void setConsult_invite_enable(boolean consult_invite_enable) { + this.consult_invite_enable = consult_invite_enable; + } + + public String getConsult_invite_accept() { + return consult_invite_accept; + } + + public void setConsult_invite_accept(String consult_invite_accept) { + this.consult_invite_accept = consult_invite_accept; + } + + public String getConsult_invite_later() { + return consult_invite_later; + } + + public void setConsult_invite_later(String consult_invite_later) { + this.consult_invite_later = consult_invite_later; + } + + public int getConsult_invite_delay() { + return consult_invite_delay; + } + + public void setConsult_invite_delay(int consult_invite_delay) { + this.consult_invite_delay = consult_invite_delay; + } + + public String getConsult_invite_bg() { + return consult_invite_bg; + } + + public void setConsult_invite_bg(String consult_invite_bg) { + this.consult_invite_bg = consult_invite_bg; + } + + public boolean isLeavemessage() { + return leavemessage; + } + + public void setLeavemessage(boolean leavemessage) { + this.leavemessage = leavemessage; + } + + public boolean isLvmname() { + return lvmname; + } + + public void setLvmname(boolean lvmname) { + this.lvmname = lvmname; + } + + public boolean isLvmphone() { + return lvmphone; + } + + public void setLvmphone(boolean lvmphone) { + this.lvmphone = lvmphone; + } + + public boolean isLvmemail() { + return lvmemail; + } + + public void setLvmemail(boolean lvmemail) { + this.lvmemail = lvmemail; + } + + public boolean isLvmaddress() { + return lvmaddress; + } + + public void setLvmaddress(boolean lvmaddress) { + this.lvmaddress = lvmaddress; + } + + public boolean isLvmcontent() { + return lvmcontent; + } + + public void setLvmcontent(boolean lvmcontent) { + this.lvmcontent = lvmcontent; + } + + public String getLvmopentype() { + return lvmopentype; + } + + public void setLvmopentype(String lvmopentype) { + this.lvmopentype = lvmopentype; + } + + public boolean isSkill() { + return skill; + } + + public void setSkill(boolean skill) { + this.skill = skill; + } + + public boolean isLvmqq() { + return lvmqq; + } + + public void setLvmqq(boolean lvmqq) { + this.lvmqq = lvmqq; + } + + public String getConsult_skill_logo() { + return consult_skill_logo; + } + + public void setConsult_skill_logo(String consult_skill_logo) { + this.consult_skill_logo = consult_skill_logo; + } + + public String getConsult_skill_title() { + return consult_skill_title; + } + + public void setConsult_skill_title(String consult_skill_title) { + this.consult_skill_title = consult_skill_title; + } + + public String getConsult_skill_img() { + return consult_skill_img; + } + + public void setConsult_skill_img(String consult_skill_img) { + this.consult_skill_img = consult_skill_img; + } + + public String getConsult_skill_msg() { + return consult_skill_msg; + } + + public void setConsult_skill_msg(String consult_skill_msg) { + this.consult_skill_msg = consult_skill_msg; + } + + public int getConsult_skill_numbers() { + return consult_skill_numbers; + } + + public void setConsult_skill_numbers(int consult_skill_numbers) { + this.consult_skill_numbers = consult_skill_numbers; + } + + public int getConsult_skill_maxagent() { + return consult_skill_maxagent; + } + + public void setConsult_skill_maxagent(int consult_skill_maxagent) { + this.consult_skill_maxagent = consult_skill_maxagent; + } + + public String getConsult_skill_bottomtitle() { + return consult_skill_bottomtitle; + } + + public void setConsult_skill_bottomtitle(String consult_skill_bottomtitle) { + this.consult_skill_bottomtitle = consult_skill_bottomtitle; + } + + public boolean isAi() { + return ai; + } + + public void setAi(boolean ai) { + this.ai = ai; + } + + public boolean isAifirst() { + return aifirst; + } + + public void setAifirst(boolean aifirst) { + this.aifirst = aifirst; + } + + public boolean isAisearch() { + return aisearch; + } + + public void setAisearch(boolean aisearch) { + this.aisearch = aisearch; + } + + public String getAimsg() { + return aimsg; + } + + public void setAimsg(String aimsg) { + this.aimsg = aimsg; + } + + public String getAisuccesstip() { + return aisuccesstip; + } + + public void setAisuccesstip(String aisuccesstip) { + this.aisuccesstip = aisuccesstip; + } + + public String getAiname() { + return ainame; + } + + public void setAiname(String ainame) { + this.ainame = ainame; + } + + public boolean isConsult_info() { + return consult_info; + } + + public void setConsult_info(boolean consult_info) { + this.consult_info = consult_info; + } + + public boolean isConsult_info_name() { + return consult_info_name; + } + + public void setConsult_info_name(boolean consult_info_name) { + this.consult_info_name = consult_info_name; + } + + public boolean isConsult_info_email() { + return consult_info_email; + } + + public void setConsult_info_email(boolean consult_info_email) { + this.consult_info_email = consult_info_email; + } + + public boolean isConsult_info_phone() { + return consult_info_phone; + } + + public void setConsult_info_phone(boolean consult_info_phone) { + this.consult_info_phone = consult_info_phone; + } + + public boolean isConsult_info_resion() { + return consult_info_resion; + } + + public void setConsult_info_resion(boolean consult_info_resion) { + this.consult_info_resion = consult_info_resion; + } + + public String getConsult_info_message() { + return consult_info_message; + } + + public void setConsult_info_message(String consult_info_message) { + this.consult_info_message = consult_info_message; + } + + public boolean isConsult_info_cookies() { + return consult_info_cookies; + } + + public void setConsult_info_cookies(boolean consult_info_cookies) { + this.consult_info_cookies = consult_info_cookies; + } + + public boolean isRecordhis() { + return recordhis; + } + + public void setRecordhis(boolean recordhis) { + this.recordhis = recordhis; + } + + public boolean isTraceuser() { + return traceuser; + } + + public void setTraceuser(boolean traceuser) { + this.traceuser = traceuser; + } + + public boolean isConsult_skill_agent() { + return consult_skill_agent; + } + + public void setConsult_skill_agent(boolean consult_skill_agent) { + this.consult_skill_agent = consult_skill_agent; + } + + public boolean isOnlyareaskill() { + return onlyareaskill; + } + + public void setOnlyareaskill(boolean onlyareaskill) { + this.onlyareaskill = onlyareaskill; + } + + public String getAreaskilltipmsg() { + return areaskilltipmsg; + } + + public void setAreaskilltipmsg(String areaskilltipmsg) { + this.areaskilltipmsg = areaskilltipmsg; + } + + public String getAiid() { + return aiid; + } + + public void setAiid(String aiid) { + this.aiid = aiid; + } + + public int getMaxwordsnum() { + return maxwordsnum; + } + + public void setMaxwordsnum(int maxwordsnum) { + this.maxwordsnum = maxwordsnum; + } + + public String getAgentshortcutkey() { + return agentshortcutkey; + } + + public void setAgentshortcutkey(String agentshortcutkey) { + this.agentshortcutkey = agentshortcutkey; + } + + public String getUsershortcutkey() { + return usershortcutkey; + } + + public void setUsershortcutkey(String usershortcutkey) { + this.usershortcutkey = usershortcutkey; + } + + public boolean isCtrlenter() { + return ctrlenter; + } + + public void setCtrlenter(boolean ctrlenter) { + this.ctrlenter = ctrlenter; + } + + public boolean isConsult_skill_fixed() { + return consult_skill_fixed; + } + + public void setConsult_skill_fixed(boolean consult_skill_fixed) { + this.consult_skill_fixed = consult_skill_fixed; + } + + public String getConsult_skill_fixed_id() { + return consult_skill_fixed_id; + } + + public void setConsult_skill_fixed_id(String consult_skill_fixed_id) { + this.consult_skill_fixed_id = consult_skill_fixed_id; + } + + public boolean isWhitelist_mode() { + return whitelist_mode; + } + + public void setWhitelist_mode(boolean whitelist_mode) { + this.whitelist_mode = whitelist_mode; + } } diff --git a/contact-center/app/src/main/resources/WEB-INF/data/templates/contacts_template.xls b/contact-center/app/src/main/resources/WEB-INF/data/templates/contacts_template.xls index 7480558e439f8d10832ec2be31e64a30fabac7a9..3201ed19b606a493a944c21475c8f212c285e277 100644 GIT binary patch literal 26112 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 tCO`~2Rolb1fpZ7k+wo!db#N2k4cZm{ +
+
+
+
无 +
+
+
+ +
+
2、选择入口颜色
@@ -474,7 +484,7 @@ function() { $("#ukefu-point-theme") .removeClass( - "ukefu-point-theme1 ukefu-point-theme2 ukefu-point-theme3") + "ukefu-point-theme1 ukefu-point-theme2 ukefu-point-theme3 ukefu-point-theme9") .addClass( $(this) .attr( diff --git a/contact-center/app/src/main/resources/templates/admin/webim/profile.html b/contact-center/app/src/main/resources/templates/admin/webim/profile.html index 407650e8..44022f4f 100644 --- a/contact-center/app/src/main/resources/templates/admin/webim/profile.html +++ b/contact-center/app/src/main/resources/templates/admin/webim/profile.html @@ -505,6 +505,19 @@
+
+
15、白名单模式
+
+
+
+

联系人访问才显示在线客服按钮

+
+
+ checked="checked"> +
+
+
+
diff --git a/contact-center/app/src/main/resources/templates/apps/agent/agentusers.html b/contact-center/app/src/main/resources/templates/apps/agent/agentusers.html index 0732cb6c..2792dd53 100644 --- a/contact-center/app/src/main/resources/templates/apps/agent/agentusers.html +++ b/contact-center/app/src/main/resources/templates/apps/agent/agentusers.html @@ -33,7 +33,7 @@ <#list agentUserList as agentuser>
  • - + <#if agentuser.status?? && agentuser.status == 'end'> <#if agentuser.channel?? && agentuser.channel == "weixin"> diff --git a/contact-center/app/src/main/resources/templates/apps/agent/index.html b/contact-center/app/src/main/resources/templates/apps/agent/index.html index e6a64f71..ad15d0f9 100644 --- a/contact-center/app/src/main/resources/templates/apps/agent/index.html +++ b/contact-center/app/src/main/resources/templates/apps/agent/index.html @@ -153,6 +153,14 @@ } } + function cleanTopMsgTip(tip){ + var lastMsgNum = $(tip).find('.last-msg').text(); + if(lastMsgNum){ + var num = Number.parseInt(lastMsgNum); + Proxy.cleanTopMsgTip(num) + } + } + /** * 结束会话,RestAPI请求 * @param agentUserId diff --git a/contact-center/app/src/main/resources/templates/apps/cca/agentusers.html b/contact-center/app/src/main/resources/templates/apps/cca/agentusers.html index 9c5a58cb..d167526e 100644 --- a/contact-center/app/src/main/resources/templates/apps/cca/agentusers.html +++ b/contact-center/app/src/main/resources/templates/apps/cca/agentusers.html @@ -31,7 +31,7 @@ <#list agentUserList as agentuser>
  • - + <#if agentuser.status?? && agentuser.status == 'end'> <#if agentuser.channel?? && agentuser.channel == "weixin"> diff --git a/contact-center/app/src/main/resources/templates/apps/cca/index.html b/contact-center/app/src/main/resources/templates/apps/cca/index.html index fdd9dc6a..926206d7 100644 --- a/contact-center/app/src/main/resources/templates/apps/cca/index.html +++ b/contact-center/app/src/main/resources/templates/apps/cca/index.html @@ -134,5 +134,13 @@ otherTopicSearch(); } } + + function cleanTopMsgTip(tip){ + var lastMsgNum = $(tip).find('.last-msg').text(); + if(lastMsgNum){ + var num = Number.parseInt(lastMsgNum); + Proxy.cleanTopMsgTip(num) + } + } diff --git a/contact-center/app/src/main/resources/templates/apps/desktop/index.html b/contact-center/app/src/main/resources/templates/apps/desktop/index.html index 3b065544..9234e1c8 100644 --- a/contact-center/app/src/main/resources/templates/apps/desktop/index.html +++ b/contact-center/app/src/main/resources/templates/apps/desktop/index.html @@ -9,7 +9,10 @@
    -
    +
    +
    + +

    在线客服业务概况

    diff --git a/contact-center/app/src/main/resources/templates/apps/im/point.html b/contact-center/app/src/main/resources/templates/apps/im/point.html index b94f5659..0993e343 100644 --- a/contact-center/app/src/main/resources/templates/apps/im/point.html +++ b/contact-center/app/src/main/resources/templates/apps/im/point.html @@ -61,18 +61,39 @@ var protocol = window.location.protocol.replace(/:/g,''); document.cookie="" -function chatoperaInit(list){ -ajax({ -url: protocol + "://${hostname!''}<#if port?? && port != 80>:${port!''}/im/userinformation.html?sessionid=${sessionid!''}", -type:'POST', -data:{"userid":cskefuOnlineUserId,'uid':list.uid,'username':list.username,'cid':list.cid,'company_name':list.company_name,'sid':list.sid,'system_name':list.system_name}, -dataType:"json", -contentType: "application/json", -async:false, -success:function(res){ -} -}); -} + +function chatoperaInit(info) { + ajax({ + url: + protocol + "://${hostname!''}<#if port?? && port != 80>:${port!''}/im/chatoperainit.html?sessionid=${sessionid!''}", + type: "POST", + data: { + <#if inviteData.whitelist_mode == true > + whitelist_mode: ${inviteData.whitelist_mode}, + <#else> + whitelist_mode: false, + + userid: cskefuOnlineUserId, + uid: info.uid, + username: info.username, + cid: info.cid, + company_name: info.company_name, + sid: info.sid, + system_name: info.system_name + }, + dataType: "json", + contentType: "application/json", + async: false, + success: function(res) { + <#if inviteData.whitelist_mode == true > + if(res == 'usc'){ + document.getElementById("ukefu-point").style.display = "block" ; + } + + } + }); + } + <#assign style = 'text-align:center;height: 150px;border-radius: 30px;width: 40px;margin: 0px 5px 0 0; float:left ; word-wrap: break-word;overflow: hidden;font-size:15px;color:#FFFFFF;text-align: center;padding-top: 15px;border: 1px solid #DCDCDC;background-color:#008df3;'> <#if inviteData.consult_vsitorbtn_model?? && inviteData.consult_vsitorbtn_model == "2"> @@ -282,10 +303,10 @@ var cskefu = { "
    <#if inviteData.consult_skill_bottomtitle??>${inviteData.consult_skill_bottomtitle!''}
    "+ "
    " ; -<#if webimexist == true > + append(document.body, ''); append(document.body, "
    "); - + <#if inviteData?? && inviteData.skill == true && inviteData.consult_skill_fixed == false> document.getElementById("ukefu-im-point-text").onclick=function(){ if(document.getElementById("ichatContent").style.display == "none"){ @@ -295,11 +316,9 @@ var cskefu = { } } <#else> -<#if webimexist == true > document.getElementById("ukefu-point").onclick=function(){ cskefu.openChatDialog(); } - var inviteDialog = document.getElementById('ukefu-invite-dialog'); <#if phone?? && mobile == true> @@ -309,10 +328,9 @@ var cskefu = { var width = document.documentElement.clientWidth ; var top = (50 - 92*100/height)+"%"; var left = (50 - 210*100/width)+"%" ; -<#if webimexist == true > + inviteDialog.style.top = top ; inviteDialog.style.left = left ; - <#if inviteAd??> var inviteAdHtml = @@ -365,9 +383,11 @@ var cskefu = { display:function(){ cskefu.writepoint(); <#if !(inviteData.consult_vsitorbtn_display??) || (inviteData.consult_vsitorbtn_display?? && inviteData.consult_vsitorbtn_display == 0)> -<#if webimexist == true > -document.getElementById("ukefu-point").style.display = "block" ; - + + <#if inviteData?? && inviteData.consult_vsitorbtn_model != '9' && inviteData.whitelist_mode == false> + document.getElementById("ukefu-point").style.display = "block" ; + + <#if inviteData.consult_invite_enable> <#if inviteData.consult_invite_delay?? && inviteData.consult_invite_delay == 0> cskefu.writeinvite() ; @@ -433,17 +453,19 @@ function openAgentChatDialog(url){ return cskefu.openChatDialogWithURL(url); } -Fingerprint2.get({}, function(components){ - var glue = components.map(function (component) { return component.value }) - cskefuOnlineUserId = Fingerprint2.x64hash128(glue.join(''), 31) - cskefu.ajax(cskefu.in+"&userid="+cskefuOnlineUserId+"&t="+new Date().getTime() , function(data){ - if(data == "in"){}else{ - cskefu.display(); - cskefu.ping(); - cskefu.check(); - } +<#if webimexist == true > + Fingerprint2.get({}, function(components){ + var glue = components.map(function (component) { return component.value }) + cskefuOnlineUserId = Fingerprint2.x64hash128(glue.join(''), 31) + cskefu.ajax(cskefu.in+"&userid="+cskefuOnlineUserId+"&t="+new Date().getTime() , function(data){ + if(data == "in"){}else{ + cskefu.display(); + cskefu.ping(); + cskefu.check(); + } + }); }); -}); + var onlineAddress = protocol + "://${hostname!''}<#if port?? && port != 80 && port != 443>:${port!''}"; var newscript = document.createElement('script'); diff --git a/contact-center/app/src/main/resources/templates/resource/css/ukefu.html b/contact-center/app/src/main/resources/templates/resource/css/ukefu.html index 8c121447..7c380897 100644 --- a/contact-center/app/src/main/resources/templates/resource/css/ukefu.html +++ b/contact-center/app/src/main/resources/templates/resource/css/ukefu.html @@ -837,6 +837,11 @@ body .site-ukefu-nav .layui-nav-item{line-height: 40px} border: 1px solid #DCDCDC; background-color:#dddddd; } + +#ukefu-point .ukefu-point-theme9 { + display:none !important; +} + .ukefu-im-point .ukefu-point-theme3{ height: 70px; border-radius: 70px; diff --git a/contact-center/config/sql/cosinee-MySQL-slim.sql b/contact-center/config/sql/cosinee-MySQL-slim.sql index 28280e11..ce73b7f8 100644 --- a/contact-center/config/sql/cosinee-MySQL-slim.sql +++ b/contact-center/config/sql/cosinee-MySQL-slim.sql @@ -1537,6 +1537,7 @@ CREATE TABLE `uk_consult_invite` ( `usershortcutkey` varchar(32) DEFAULT NULL COMMENT '访客默认回复消息快捷键', `agentctrlenter` tinyint(4) DEFAULT '0' COMMENT '启用坐席端CTRL+Enter发送消息', `ctrlenter` tinyint(4) DEFAULT '0' COMMENT '启用访客端CTRL+Enter发送消息', + `whitelist_mode` tinyint(4) DEFAULT '0' COMMENT '启用白名单', PRIMARY KEY (`id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPACT COMMENT='访客网站配置表'; @@ -7941,6 +7942,29 @@ CREATE TABLE `uk_tableproperties` ( INSERT INTO `uk_tableproperties` (`ID`, `NAME`, `CODE`, `GROUPID`, `USERID`, `FIELDNAME`, `DATATYPECODE`, `DATATYPENAME`, `DBTABLEID`, `INDEXDATATYPE`, `PK`, `MODITS`, `INDEXFIELD`, `PLUGIN`, `ORGI`, `FKTABLE`, `FKPROPERTY`, `TABLENAME`, `viewtype`, `SORTINDEX`, `SYSTEMFIELD`, `INX`, `TOKEN`, `LENGTH`, `FIELDSTATUS`, `SELDATA`, `SELDATACODE`, `SELDATAKEY`, `SELDATAVALUE`, `SELDATATYPE`, `REFTBID`, `REFTPID`, `REFTYPE`, `REFTBNAME`, `REFTPNAME`, `REFTPTITLEFIELD`, `REFFK`, `DEFAULTSORT`, `DEFAULTVALUE`, `DEFAULTVALUETITLE`, `DEFAULTFIELDVALUE`, `MULTPARTFILE`, `UPLOADTYPE`, `cascadetype`, `title`, `DESCORDER`, `impfield`, `tokentype`, `phonenumber`, `phonetype`, `phonememo`, `secfield`, `secdistype`, `styletype`, `sysfield`) VALUES + ('2c9480886e91d9e5016e91f528ac018f', '性别', NULL, NULL, NULL, 'gender', 0, 'text', '2c9480886e91d9e5016e91f528ab018d', NULL, 0, 0, NULL, NULL, 'cskefu', NULL, NULL, 'uk_contacts', NULL, 100, 0, 1, 0, 60, 1, 1, 'com.dic.contacts.sex', NULL, NULL, '', '', NULL, NULL, NULL, NULL, NULL, 0, 0, NULL, NULL, NULL, 1, NULL, NULL, 0, 0, 0, NULL, 0, NULL, NULL, 0, NULL, NULL, 0), + ('2c9480886e91d9e5016e91f528ac0190', '出生日期', NULL, NULL, NULL, 'cusbirthday', 0, 'text', '2c9480886e91d9e5016e91f528ab018d', NULL, 0, 0, NULL, NULL, 'cskefu', NULL, NULL, 'uk_contacts', NULL, 100, 0, 1, 0, 50, 1, 0, NULL, NULL, NULL, '', NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, NULL, NULL, NULL, 1, NULL, NULL, 0, 0, 0, NULL, 0, NULL, NULL, 0, NULL, NULL, 0), + ('2c9480886e91d9e5016e91f528ac0192', '联系人类别', NULL, NULL, NULL, 'ckind', 0, 'text', '2c9480886e91d9e5016e91f528ab018d', NULL, 0, 0, NULL, NULL, 'cskefu', NULL, NULL, 'uk_contacts', NULL, 100, 0, 1, 0, 60, 1, 1, 'com.dic.contacts.ckind', NULL, NULL, '', '', NULL, NULL, NULL, NULL, NULL, 0, 0, NULL, NULL, NULL, 1, NULL, NULL, 0, 0, 0, NULL, 0, NULL, NULL, 0, NULL, NULL, 0), + ('2c9480886e91d9e5016e91f528af019e', '电子邮件', NULL, NULL, NULL, 'email', 0, 'text', '2c9480886e91d9e5016e91f528ab018d', NULL, 0, 0, NULL, NULL, 'cskefu', NULL, NULL, 'uk_contacts', NULL, 100, 0, 1, 0, 128, 1, 0, NULL, NULL, NULL, '', NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, NULL, NULL, NULL, 1, NULL, NULL, 0, 0, 0, NULL, 0, NULL, NULL, 0, NULL, NULL, 0), + ('2c9480886e91d9e5016e91f528b001a0', '手机号码', NULL, NULL, NULL, 'mobileno', 0, 'text', '2c9480886e91d9e5016e91f528ab018d', NULL, 0, 0, NULL, NULL, 'cskefu', NULL, NULL, 'uk_contacts', NULL, 100, 0, 1, 0, 40, 1, 0, NULL, NULL, NULL, '', NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, NULL, NULL, NULL, 1, NULL, NULL, 0, 0, 0, NULL, 0, NULL, NULL, 0, NULL, NULL, 0), + ('2c9480886e91d9e5016e91f528b101a2', '办公电话', NULL, NULL, NULL, 'phone', 0, 'text', '2c9480886e91d9e5016e91f528ab018d', NULL, 0, 0, NULL, NULL, 'cskefu', NULL, NULL, 'uk_contacts', NULL, 100, 0, 1, 0, 40, 1, 0, NULL, NULL, NULL, '', NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, NULL, NULL, NULL, 1, NULL, NULL, 0, 0, 0, NULL, 0, NULL, NULL, 0, NULL, NULL, 0), + ('2c9480886e91d9e5016e91f528b301ab', '省', NULL, NULL, NULL, 'province', 0, 'text', '2c9480886e91d9e5016e91f528ab018d', NULL, 0, 0, NULL, NULL, 'cskefu', NULL, NULL, 'uk_contacts', NULL, 100, 0, 1, 0, 60, 1, 1, 'com.dic.address.area', NULL, NULL, '', '', NULL, NULL, NULL, NULL, NULL, 0, 0, NULL, NULL, NULL, 1, NULL, NULL, 0, 0, 0, NULL, 0, NULL, NULL, 0, NULL, NULL, 0), + ('2c9480886e91d9e5016e91f528b401ac', '市(区)县', NULL, NULL, NULL, 'city', 0, 'text', '2c9480886e91d9e5016e91f528ab018d', NULL, 0, 0, NULL, NULL, 'cskefu', NULL, NULL, 'uk_contacts', NULL, 100, 0, 1, 0, 60, 1, 1, 'com.dic.address.area', NULL, NULL, '', '', NULL, NULL, NULL, NULL, NULL, 0, 0, NULL, NULL, NULL, 1, NULL, NULL, 0, 0, 0, NULL, 0, NULL, NULL, 0, NULL, NULL, 0), + ('2c9480886e91d9e5016e91f528b401ad', '地址', NULL, NULL, NULL, 'address', 0, 'text', '2c9480886e91d9e5016e91f528ab018d', NULL, 0, 0, NULL, NULL, 'cskefu', NULL, NULL, 'uk_contacts', NULL, 100, 0, 1, 0, 65535, 1, 0, NULL, NULL, NULL, '', NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, NULL, NULL, NULL, 1, NULL, NULL, 0, 0, 0, NULL, 0, NULL, NULL, 0, NULL, NULL, 0), + ('2c9480886e91d9e5016e91f528b801bb', '最后联系时间', NULL, NULL, NULL, 'touchtime', 0, 'datetime', '2c9480886e91d9e5016e91f528ab018d', NULL, 0, 0, NULL, NULL, 'cskefu', NULL, NULL, 'uk_contacts', NULL, 100, 0, 1, 0, 19, 1, 0, NULL, NULL, NULL, '', NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, NULL, NULL, NULL, 1, NULL, NULL, 0, 0, 0, NULL, 0, NULL, NULL, 0, NULL, NULL, 0), + ('2c9480886e91d9e5016e91f528b901be', '创建人', NULL, NULL, NULL, 'creater', 0, 'text', '2c9480886e91d9e5016e91f528ab018d', NULL, 0, 0, NULL, NULL, 'cskefu', NULL, NULL, 'uk_contacts', NULL, 100, 0, 1, 0, 60, 1, 0, '', NULL, NULL, '', 'userdata', NULL, NULL, NULL, NULL, NULL, 1, 0, NULL, NULL, NULL, 1, NULL, NULL, 0, 0, 0, NULL, 0, NULL, NULL, 0, NULL, NULL, 0), + ('2c9480886e91d9e5016e91f528b901c1', '联系人备注', NULL, NULL, NULL, 'memo', 0, 'text', '2c9480886e91d9e5016e91f528ab018d', NULL, 0, 0, NULL, NULL, 'cskefu', NULL, NULL, 'uk_contacts', NULL, 100, 0, 1, 0, 255, 1, 0, NULL, NULL, NULL, '', NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, NULL, NULL, NULL, 1, NULL, NULL, 0, 0, 0, NULL, 0, NULL, NULL, 0, NULL, NULL, 0), + ('2c9480886e91d9e5016e91f528b901c3', '修改时间', NULL, NULL, NULL, 'updatetime', 0, 'datetime', '2c9480886e91d9e5016e91f528ab018d', NULL, 0, 0, NULL, NULL, 'cskefu', NULL, NULL, 'uk_contacts', NULL, 100, 0, 1, 0, 19, 1, 0, NULL, NULL, NULL, '', NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, NULL, NULL, NULL, 1, NULL, NULL, 0, 0, 0, NULL, 0, NULL, NULL, 0, NULL, NULL, 0), + ('2c9480886e91d9e5016e91f528ba01c6', '创建时间', NULL, NULL, NULL, 'createtime', 0, 'datetime', '2c9480886e91d9e5016e91f528ab018d', NULL, 0, 0, NULL, NULL, 'cskefu', NULL, NULL, 'uk_contacts', NULL, 100, 0, 1, 0, 19, 1, 0, NULL, NULL, NULL, '', NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, NULL, NULL, NULL, 1, NULL, NULL, 0, 0, 0, NULL, 0, NULL, NULL, 0, NULL, NULL, 0), + ('2c9480886e91d9e5016e91f528ba01c7', '联系人姓名', NULL, NULL, NULL, 'name', 0, 'text', '2c9480886e91d9e5016e91f528ab018d', NULL, 0, 0, NULL, NULL, 'cskefu', NULL, NULL, 'uk_contacts', NULL, 100, 0, 1, 0, 255, 1, 0, '', NULL, NULL, '', '', NULL, NULL, NULL, NULL, NULL, 0, 0, NULL, NULL, NULL, 1, NULL, NULL, 0, 0, 0, NULL, 0, NULL, NULL, 0, NULL, NULL, 0), + ('2c9480886e91d9e5016e91f528ba01ca', '分享给', NULL, NULL, NULL, 'shares', 0, 'text', '2c9480886e91d9e5016e91f528ab018d', NULL, 0, 0, NULL, NULL, 'cskefu', NULL, NULL, 'uk_contacts', NULL, 100, 0, 1, 0, 255, 1, 0, NULL, NULL, NULL, '', NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, NULL, NULL, NULL, 1, NULL, NULL, 0, 0, 0, NULL, 0, NULL, NULL, 0, NULL, NULL, 0), + ('2c9480886e91d9e5016e91f528bb01d0', 'skypeid', NULL, NULL, NULL, 'skypeid', 0, 'text', '2c9480886e91d9e5016e91f528ab018d', NULL, 0, 0, NULL, NULL, 'cskefu', NULL, NULL, 'uk_contacts', NULL, 100, 0, 1, 0, 100, 1, 0, NULL, NULL, NULL, '', NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, NULL, NULL, NULL, 1, NULL, NULL, 0, 0, 0, NULL, 0, NULL, NULL, 0, NULL, NULL, 0), + ('2c9480886e91d9e5016e91f528bb01d1', '人员id', NULL, NULL, NULL, 'wluid', 0, 'text', '2c9480886e91d9e5016e91f528ab018d', NULL, 0, 0, NULL, NULL, 'cskefu', NULL, NULL, 'uk_contacts', NULL, 100, 0, 1, 0, 100, 1, 0, NULL, NULL, NULL, '', NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, NULL, NULL, NULL, 1, NULL, NULL, 0, 0, 0, NULL, 0, NULL, NULL, 0, NULL, NULL, 0), + ('2c9480886e91d9e5016e91f528bc01d2', '人员名称', NULL, NULL, NULL, 'wlusername', 0, 'text', '2c9480886e91d9e5016e91f528ab018d', NULL, 0, 0, NULL, NULL, 'cskefu', NULL, NULL, 'uk_contacts', NULL, 100, 0, 1, 0, 255, 1, 0, NULL, NULL, NULL, '', NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, NULL, NULL, NULL, 1, NULL, NULL, 0, 0, 0, NULL, 0, NULL, NULL, 0, NULL, NULL, 0), + ('2c9480886e91d9e5016e91f528bc01d3', '公司id', NULL, NULL, NULL, 'wlcid', 0, 'text', '2c9480886e91d9e5016e91f528ab018d', NULL, 0, 0, NULL, NULL, 'cskefu', NULL, NULL, 'uk_contacts', NULL, 100, 0, 1, 0, 100, 1, 0, NULL, NULL, NULL, '', NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, NULL, NULL, NULL, 1, NULL, NULL, 0, 0, 0, NULL, 0, NULL, NULL, 0, NULL, NULL, 0), + ('2c9480886e91d9e5016e91f528bc01d4', '公司名称', NULL, NULL, NULL, 'wlcompany_name', 0, 'text', '2c9480886e91d9e5016e91f528ab018d', NULL, 0, 0, NULL, NULL, 'cskefu', NULL, NULL, 'uk_contacts', NULL, 100, 0, 1, 0, 255, 1, 0, NULL, NULL, NULL, '', NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, NULL, NULL, NULL, 1, NULL, NULL, 0, 0, 0, NULL, 0, NULL, NULL, 0, NULL, NULL, 0), + ('2c9480886e91d9e5016e91f528bc01d5', '子系统id', NULL, NULL, NULL, 'wlsid', 0, 'text', '2c9480886e91d9e5016e91f528ab018d', NULL, 0, 0, NULL, NULL, 'cskefu', NULL, NULL, 'uk_contacts', NULL, 100, 0, 1, 0, 100, 1, 0, NULL, NULL, NULL, '', NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, NULL, NULL, NULL, 1, NULL, NULL, 0, 0, 0, NULL, 0, NULL, NULL, 0, NULL, NULL, 0), + ('2c9480886e91d9e5016e91f528bc01d6', '子系统名称', NULL, NULL, NULL, 'wlsystem_name', 0, 'text', '2c9480886e91d9e5016e91f528ab018d', NULL, 0, 0, NULL, NULL, 'cskefu', NULL, NULL, 'uk_contacts', NULL, 100, 0, 1, 0, 255, 1, 0, NULL, NULL, NULL, '', NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, NULL, NULL, NULL, 1, NULL, NULL, 0, 0, 0, NULL, 0, NULL, NULL, 0, NULL, NULL, 0), ('402870876e5d9773016e5e95575801c2', '企(事)业单位名称', NULL, NULL, NULL, 'name', 0, 'text', '402870876e5d9773016e5e95575601c0', NULL, 0, 0, NULL, NULL, 'cskefu', NULL, NULL, 'uk_entcustomer', NULL, 100, 0, 1, 0, 255, 1, 0, NULL, NULL, NULL, '', NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, NULL, NULL, NULL, 1, NULL, NULL, 0, 0, 0, NULL, 0, NULL, NULL, 0, NULL, NULL, 0), ('402870876e5d9773016e5e95575801c3', '单位性质', NULL, NULL, NULL, 'etype', 0, 'text', '402870876e5d9773016e5e95575601c0', NULL, 0, 0, NULL, NULL, 'cskefu', NULL, NULL, 'uk_entcustomer', NULL, 100, 0, 1, 0, 60, 1, 1, 'com.dic.customer.etype', NULL, NULL, '', '', NULL, NULL, NULL, NULL, NULL, 0, 0, NULL, NULL, NULL, 1, NULL, NULL, 0, 0, 0, NULL, 0, NULL, NULL, 0, NULL, NULL, 0), ('402870876e5d9773016e5e95575b01c4', '客户类别', NULL, NULL, NULL, 'ekind', 0, 'text', '402870876e5d9773016e5e95575601c0', NULL, 0, 0, NULL, NULL, 'cskefu', NULL, NULL, 'uk_entcustomer', NULL, 100, 0, 1, 0, 60, 1, 1, 'com.dic.contacts.entype', NULL, NULL, '', '', NULL, NULL, NULL, NULL, NULL, 0, 0, NULL, NULL, NULL, 1, NULL, NULL, 0, 0, 0, NULL, 0, NULL, NULL, 0, NULL, NULL, 0), @@ -7958,23 +7982,6 @@ VALUES ('402870876e5d9773016e5e95576401f4', '修改时间', NULL, NULL, NULL, 'updatetime', 0, 'datetime', '402870876e5d9773016e5e95575601c0', NULL, 0, 0, NULL, NULL, 'cskefu', NULL, NULL, 'uk_entcustomer', NULL, 100, 0, 1, 0, 19, 1, 0, NULL, NULL, NULL, '', NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, NULL, NULL, NULL, 1, NULL, NULL, 0, 0, 0, NULL, 0, NULL, NULL, 0, NULL, NULL, 0), ('402870876e5d9773016e5e95576401f6', '创建时间', NULL, NULL, NULL, 'createtime', 0, 'datetime', '402870876e5d9773016e5e95575601c0', NULL, 0, 0, NULL, NULL, 'cskefu', NULL, NULL, 'uk_entcustomer', NULL, 100, 0, 1, 0, 19, 1, 0, NULL, NULL, NULL, '', NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, NULL, NULL, NULL, 1, NULL, NULL, 0, 0, 0, NULL, 0, NULL, NULL, 0, NULL, NULL, 0), ('402870876e5d9773016e5e95576401f9', '分享给', NULL, NULL, NULL, 'shares', 0, 'text', '402870876e5d9773016e5e95575601c0', NULL, 0, 0, NULL, NULL, 'cskefu', NULL, NULL, 'uk_entcustomer', NULL, 100, 0, 1, 0, 255, 1, 0, NULL, NULL, NULL, '', NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, NULL, NULL, NULL, 1, NULL, NULL, 0, 0, 0, NULL, 0, NULL, NULL, 0, NULL, NULL, 0), - ('402870876e5d9773016e5e95d6350206', '联系人性别', NULL, NULL, NULL, 'gender', 0, 'text', '402870876e5d9773016e5e95d6350204', NULL, 0, 0, NULL, NULL, 'cskefu', NULL, NULL, 'uk_contacts', NULL, 100, 0, 1, 0, 60, 1, 1, 'com.dic.contacts.sex', NULL, NULL, '', '', NULL, NULL, NULL, NULL, NULL, 0, 0, NULL, NULL, NULL, 1, NULL, NULL, 0, 0, 0, NULL, 0, NULL, NULL, 0, NULL, NULL, 0), - ('402870876e5d9773016e5e95d6350207', '出生日期', NULL, NULL, NULL, 'cusbirthday', 0, 'text', '402870876e5d9773016e5e95d6350204', NULL, 0, 0, NULL, NULL, 'cskefu', NULL, NULL, 'uk_contacts', NULL, 100, 0, 1, 0, 50, 1, 0, NULL, NULL, NULL, '', NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, NULL, NULL, NULL, 1, NULL, NULL, 0, 0, 0, NULL, 0, NULL, NULL, 0, NULL, NULL, 0), - ('402870876e5d9773016e5e95d6360209', '联系人类别', NULL, NULL, NULL, 'ckind', 0, 'text', '402870876e5d9773016e5e95d6350204', NULL, 0, 0, NULL, NULL, 'cskefu', NULL, NULL, 'uk_contacts', NULL, 100, 0, 1, 0, 60, 1, 1, 'com.dic.contacts.ckind', NULL, NULL, '', '', NULL, NULL, NULL, NULL, NULL, 0, 0, NULL, NULL, NULL, 1, NULL, NULL, 0, 0, 0, NULL, 0, NULL, NULL, 0, NULL, NULL, 0), - ('402870876e5d9773016e5e95d6370215', '电子邮件', NULL, NULL, NULL, 'email', 0, 'text', '402870876e5d9773016e5e95d6350204', NULL, 0, 0, NULL, NULL, 'cskefu', NULL, NULL, 'uk_contacts', NULL, 100, 0, 1, 0, 128, 1, 0, NULL, NULL, NULL, '', NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, NULL, NULL, NULL, 1, NULL, NULL, 0, 0, 0, NULL, 0, NULL, NULL, 0, NULL, NULL, 0), - ('402870876e5d9773016e5e95d6370217', '手机号码', NULL, NULL, NULL, 'mobileno', 0, 'text', '402870876e5d9773016e5e95d6350204', NULL, 0, 0, NULL, NULL, 'cskefu', NULL, NULL, 'uk_contacts', NULL, 100, 0, 1, 0, 40, 1, 0, NULL, NULL, NULL, '', NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, NULL, NULL, NULL, 1, NULL, NULL, 0, 0, 0, NULL, 0, NULL, NULL, 0, NULL, NULL, 0), - ('402870876e5d9773016e5e95d6370219', '办公电话', NULL, NULL, NULL, 'phone', 0, 'text', '402870876e5d9773016e5e95d6350204', NULL, 0, 0, NULL, NULL, 'cskefu', NULL, NULL, 'uk_contacts', NULL, 100, 0, 1, 0, 40, 1, 0, NULL, NULL, NULL, '', NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, NULL, NULL, NULL, 1, NULL, NULL, 0, 0, 0, NULL, 0, NULL, NULL, 0, NULL, NULL, 0), - ('402870876e5d9773016e5e95d6380222', '省', NULL, NULL, NULL, 'province', 0, 'text', '402870876e5d9773016e5e95d6350204', NULL, 0, 0, NULL, NULL, 'cskefu', NULL, NULL, 'uk_contacts', NULL, 100, 0, 1, 0, 60, 1, 1, 'com.dic.address.area', NULL, NULL, '', '', NULL, NULL, NULL, NULL, NULL, 0, 0, NULL, NULL, NULL, 1, NULL, NULL, 0, 0, 0, NULL, 0, NULL, NULL, 0, NULL, NULL, 0), - ('402870876e5d9773016e5e95d6380223', '市(区)县', NULL, NULL, NULL, 'city', 0, 'text', '402870876e5d9773016e5e95d6350204', NULL, 0, 0, NULL, NULL, 'cskefu', NULL, NULL, 'uk_contacts', NULL, 100, 0, 1, 0, 60, 1, 1, 'com.dic.address.area', NULL, NULL, '', '', NULL, NULL, NULL, NULL, NULL, 0, 0, NULL, NULL, NULL, 1, NULL, NULL, 0, 0, 0, NULL, 0, NULL, NULL, 0, NULL, NULL, 0), - ('402870876e5d9773016e5e95d6380224', '地址', NULL, NULL, NULL, 'address', 0, 'text', '402870876e5d9773016e5e95d6350204', NULL, 0, 0, NULL, NULL, 'cskefu', NULL, NULL, 'uk_contacts', NULL, 100, 0, 1, 0, 65535, 1, 0, NULL, NULL, NULL, '', NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, NULL, NULL, NULL, 1, NULL, NULL, 0, 0, 0, NULL, 0, NULL, NULL, 0, NULL, NULL, 0), - ('402870876e5d9773016e5e95d63a0232', '最后联系时间', NULL, NULL, NULL, 'touchtime', 0, 'datetime', '402870876e5d9773016e5e95d6350204', NULL, 0, 0, NULL, NULL, 'cskefu', NULL, NULL, 'uk_contacts', NULL, 100, 0, 1, 0, 19, 1, 0, NULL, NULL, NULL, '', NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, NULL, NULL, NULL, 1, NULL, NULL, 0, 0, 0, NULL, 0, NULL, NULL, 0, NULL, NULL, 0), - ('402870876e5d9773016e5e95d63a0235', '创建人', NULL, NULL, NULL, 'creater', 0, 'text', '402870876e5d9773016e5e95d6350204', NULL, 0, 0, NULL, NULL, 'cskefu', NULL, NULL, 'uk_contacts', NULL, 100, 0, 1, 0, 60, 1, 0, '', NULL, NULL, '', 'userdata', NULL, NULL, NULL, NULL, NULL, 1, 0, NULL, NULL, NULL, 1, NULL, NULL, 0, 0, 0, NULL, 0, NULL, NULL, 0, NULL, NULL, 0), - ('402870876e5d9773016e5e95d63b0238', '联系人备注', NULL, NULL, NULL, 'memo', 0, 'text', '402870876e5d9773016e5e95d6350204', NULL, 0, 0, NULL, NULL, 'cskefu', NULL, NULL, 'uk_contacts', NULL, 100, 0, 1, 0, 255, 1, 0, NULL, NULL, NULL, '', NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, NULL, NULL, NULL, 1, NULL, NULL, 0, 0, 0, NULL, 0, NULL, NULL, 0, NULL, NULL, 0), - ('402870876e5d9773016e5e95d63b023a', '修改时间', NULL, NULL, NULL, 'updatetime', 0, 'datetime', '402870876e5d9773016e5e95d6350204', NULL, 0, 0, NULL, NULL, 'cskefu', NULL, NULL, 'uk_contacts', NULL, 100, 0, 1, 0, 19, 1, 0, NULL, NULL, NULL, '', NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, NULL, NULL, NULL, 1, NULL, NULL, 0, 0, 0, NULL, 0, NULL, NULL, 0, NULL, NULL, 0), - ('402870876e5d9773016e5e95d63b023d', '创建时间', NULL, NULL, NULL, 'createtime', 0, 'datetime', '402870876e5d9773016e5e95d6350204', NULL, 0, 0, NULL, NULL, 'cskefu', NULL, NULL, 'uk_contacts', NULL, 100, 0, 1, 0, 19, 1, 0, NULL, NULL, NULL, '', NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, NULL, NULL, NULL, 1, NULL, NULL, 0, 0, 0, NULL, 0, NULL, NULL, 0, NULL, NULL, 0), - ('402870876e5d9773016e5e95d63b023e', '联系人名称', NULL, NULL, NULL, 'name', 0, 'text', '402870876e5d9773016e5e95d6350204', NULL, 0, 0, NULL, NULL, 'cskefu', NULL, NULL, 'uk_contacts', NULL, 100, 0, 1, 0, 255, 1, 0, '', NULL, NULL, '', '', NULL, NULL, NULL, NULL, NULL, 0, 0, NULL, NULL, NULL, 1, NULL, NULL, 0, 0, 0, NULL, 0, NULL, NULL, 0, NULL, NULL, 0), - ('402870876e5d9773016e5e95d63c0241', '分享给', NULL, NULL, NULL, 'shares', 0, 'text', '402870876e5d9773016e5e95d6350204', NULL, 0, 0, NULL, NULL, 'cskefu', NULL, NULL, 'uk_contacts', NULL, 100, 0, 1, 0, 255, 1, 0, NULL, NULL, NULL, '', NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, NULL, NULL, NULL, 1, NULL, NULL, 0, 0, 0, NULL, 0, NULL, NULL, 0, NULL, NULL, 0), - ('402870876e5d9773016e5e95d63c0247', 'skypeid', NULL, NULL, NULL, 'skypeid', 0, 'text', '402870876e5d9773016e5e95d6350204', NULL, 0, 0, NULL, NULL, 'cskefu', NULL, NULL, 'uk_contacts', NULL, 100, 0, 1, 0, 100, 1, 0, NULL, NULL, NULL, '', NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, NULL, NULL, NULL, 1, NULL, NULL, 0, 0, 0, NULL, 0, NULL, NULL, 0, NULL, NULL, 0), ('402870876e5d9773016e5e9cc6380272', '坐席用户名', NULL, NULL, NULL, 'agentusername', 0, 'text', '402870876e5d9773016e5e9cc6370270', NULL, 0, 0, NULL, NULL, 'cskefu', NULL, NULL, 'uk_servicesummary', NULL, 100, 0, 1, 0, 100, 1, 0, '', NULL, NULL, '', 'userdata', NULL, NULL, NULL, NULL, NULL, 1, 0, NULL, NULL, NULL, 1, NULL, NULL, 0, 0, 0, NULL, 0, NULL, NULL, 0, NULL, NULL, 0), ('402870876e5d9773016e5e9cc6380275', '服务次数', NULL, NULL, NULL, 'times', 0, 'number', '402870876e5d9773016e5e9cc6370270', NULL, 0, 0, NULL, NULL, 'cskefu', NULL, NULL, 'uk_servicesummary', NULL, 100, 0, 1, 0, 10, 1, 0, NULL, NULL, NULL, '', NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, NULL, NULL, NULL, 1, NULL, NULL, 0, 0, 0, NULL, 0, NULL, NULL, 0, NULL, NULL, 0), ('402870876e5d9773016e5e9cc6390278', '用户名', NULL, NULL, NULL, 'username', 0, 'text', '402870876e5d9773016e5e9cc6370270', NULL, 0, 0, NULL, NULL, 'cskefu', NULL, NULL, 'uk_servicesummary', NULL, 100, 0, 1, 0, 100, 1, 0, NULL, NULL, NULL, '', NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, NULL, NULL, NULL, 1, NULL, NULL, 0, 0, 0, NULL, 0, NULL, NULL, 0, NULL, NULL, 0), @@ -8043,8 +8050,8 @@ CREATE TABLE `uk_tabletask` ( INSERT INTO `uk_tabletask` (`ID`, `NAME`, `SECURE`, `TASKSTATUS`, `TABLEDIRID`, `DBID`, `CODE`, `GROUPID`, `CREATER`, `CREATERNAME`, `TASKTYPE`, `TASKNAME`, `TASKPLAN`, `CONFIGURE`, `SECURECONF`, `USERID`, `PREVIEWTEMPLET`, `LISTBLOCKTEMPLET`, `TABLENAME`, `TABLETYPE`, `STARTINDEX`, `UPDATETIME`, `UPDATETIMENUMBER`, `DATASQL`, `DATABASETASK`, `DRIVERPLUGIN`, `ORGI`, `WORKFLOW`, `FROMDB`, `tabtype`, `pid`, `secmenuid`, `reportid`, `eventname`, `tltemplet`, `timeline`, `tbversion`, `LASTUPDATE`, `CREATETIME`) VALUES + ('2c9480886e91d9e5016e91f528ab018d', 'uk_contacts', NULL, NULL, '0', NULL, NULL, NULL, '2c9480886e91d9e5016e91db8df10017', 'xianli', NULL, 'uk_contacts', NULL, NULL, NULL, NULL, NULL, NULL, 'uk_contacts', '1', 0, '2019-11-22 15:13:13', 0, NULL, NULL, NULL, 'cskefu', 0, 0, NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, NULL, '2019-11-22 15:13:13'), ('402870876e5d9773016e5e95575601c0', 'uk_entcustomer', NULL, NULL, '0', NULL, NULL, NULL, '402870876e4f5bdd016e4f77eb6f0075', 'xiaoxiao', NULL, 'uk_entcustomer', NULL, NULL, NULL, NULL, NULL, NULL, 'uk_entcustomer', '1', 0, '2019-11-12 15:47:53', 0, NULL, NULL, NULL, 'cskefu', 0, 0, NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, NULL, '2019-11-12 15:47:53'), - ('402870876e5d9773016e5e95d6350204', 'uk_contacts', NULL, NULL, '0', NULL, NULL, NULL, '402870876e4f5bdd016e4f77eb6f0075', 'xiaoxiao', NULL, 'uk_contacts', NULL, NULL, NULL, NULL, NULL, NULL, 'uk_contacts', '1', 0, '2019-11-12 15:48:28', 0, NULL, NULL, NULL, 'cskefu', 0, 0, NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, NULL, '2019-11-12 15:48:28'), ('402870876e5d9773016e5e9cc6370270', 'uk_servicesummary', NULL, NULL, '0', NULL, NULL, NULL, '402870876e4f5bdd016e4f77eb6f0075', 'xiaoxiao', NULL, 'uk_servicesummary', NULL, NULL, NULL, NULL, NULL, NULL, 'uk_servicesummary', '1', 0, '2019-11-12 15:56:02', 0, NULL, NULL, NULL, 'cskefu', 0, 0, NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, NULL, '2019-11-12 15:56:02'); -- ---------------------------- diff --git a/docker-compose.yml b/docker-compose.yml index 1b76b0c2..7b2a98e5 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -48,6 +48,8 @@ services: - CSKEFU_MODULE_CONTACTS=true - CSKEFU_MODULE_CHATBOT=true - SKYPE_CHANNEL_CRM=${SKYPE_CHANNEL_CRM:-placeholder} + - BOT_THRESHOLD_FAQ_BEST_REPLY=${BOT_THRESHOLD_FAQ_BEST_REPLY:-0.8} + - BOT_THRESHOLD_FAQ_SUGG_REPLY=${BOT_THRESHOLD_FAQ_SUGG_REPLY:-0.6} depends_on: - mysql - redis diff --git a/public/plugins/chatbot/classes/ChatbotConstants.java b/public/plugins/chatbot/classes/ChatbotConstants.java index df6c5994..1cfd6222 100644 --- a/public/plugins/chatbot/classes/ChatbotConstants.java +++ b/public/plugins/chatbot/classes/ChatbotConstants.java @@ -17,5 +17,7 @@ package com.chatopera.cc.plugins.chatbot; public class ChatbotConstants { public static final String BOT_PROVIDER = "BOT_PROVIDER"; + 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"; } diff --git a/public/plugins/chatbot/classes/ChatbotEventSubscription.java b/public/plugins/chatbot/classes/ChatbotEventSubscription.java index 74f30088..c507bfa9 100644 --- a/public/plugins/chatbot/classes/ChatbotEventSubscription.java +++ b/public/plugins/chatbot/classes/ChatbotEventSubscription.java @@ -27,6 +27,7 @@ import com.chatopera.cc.persistence.repository.ChatbotRepository; import com.chatopera.cc.socketio.message.ChatMessage; import com.chatopera.cc.util.SerializeUtil; import com.chatopera.cc.util.SystemEnvHelper; +import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import org.slf4j.Logger; @@ -53,9 +54,17 @@ public class ChatbotEventSubscription { @Autowired private ChatbotRepository chatbotRes; + // 机器人服务提供地址 private final static String botServiecProvider = SystemEnvHelper.getenv( ChatbotConstants.BOT_PROVIDER, ChatbotConstants.DEFAULT_BOT_PROVIDER); + // FAQ最佳回复阀值 + private final static double thresholdFaqBestReply = Double.parseDouble(SystemEnvHelper.getenv( + ChatbotConstants.THRESHOLD_FAQ_BEST_REPLY, "0.8")); + // FAQ建议回复阀值 + private final static double thresholdFaqSuggReply = Double.parseDouble(SystemEnvHelper.getenv( + ChatbotConstants.THRESHOLD_FAQ_SUGG_REPLY, "0.6")); + @Autowired private ChatbotProxy chatbotProxy; @@ -82,12 +91,14 @@ public class ChatbotEventSubscription { .findOne(request.getAiid()); logger.info( - "[chat] chat request baseUrl {}, chatbot {}, fromUserId {}, textMessage {}", botServiecProvider, c.getName(), + "[chat] chat request baseUrl {}, chatbot {}, fromUserId {}, textMessage {}", botServiecProvider, + c.getName(), request.getUserid(), request.getMessage()); // Get response from Conversational Engine. com.chatopera.bot.sdk.Chatbot bot = new com.chatopera.bot.sdk.Chatbot( c.getClientId(), c.getSecret(), botServiecProvider); - JSONObject result = bot.conversation(request.getUserid(), request.getMessage()); + JSONObject result = bot.conversation( + request.getUserid(), request.getMessage(), thresholdFaqBestReply, thresholdFaqSuggReply); // parse response if (result != null) { @@ -95,31 +106,53 @@ public class ChatbotEventSubscription { if (result.getInt(RestUtils.RESP_KEY_RC) == 0) { // reply JSONObject data = result.getJSONObject("data"); - ChatMessage resp = new ChatMessage(); - resp.setCalltype(MainContext.CallType.OUT.toString()); - resp.setAppid(resp.getAppid()); - resp.setOrgi(request.getOrgi()); - resp.setAiid(request.getAiid()); - resp.setMessage(data.getString("string")); - resp.setTouser(request.getUserid()); - resp.setAgentserviceid(request.getAgentserviceid()); - resp.setMsgtype(request.getMsgtype()); - resp.setUserid(request.getUserid()); - resp.setType(request.getType()); - resp.setChannel(request.getChannel()); - if (data.has("params")) { - resp.setExpmsg(data.get("params").toString()); - } - resp.setContextid(request.getContextid()); - resp.setSessionid(request.getSessionid()); - resp.setUsession(request.getUsession()); - resp.setUsername(c.getName()); - resp.setUpdatetime(System.currentTimeMillis()); + if (data.has("logic_is_fallback")) { + ChatMessage resp = new ChatMessage(); + resp.setCalltype(MainContext.CallType.OUT.toString()); + resp.setAppid(resp.getAppid()); + resp.setOrgi(request.getOrgi()); + resp.setAiid(request.getAiid()); + resp.setMessage(data.getString("string")); - // 更新聊天机器人累计值 - updateAgentUserWithRespData(request.getUserid(), request.getOrgi(), data); - // 保存并发送 - chatbotProxy.saveAndPublish(resp); + if (data.getBoolean("logic_is_fallback")) { + // 兜底回复,检查FAQ + JSONArray faqReplies = data.getJSONArray("faq"); + JSONArray suggs = new JSONArray(); + for (int i = 0; i < faqReplies.length(); i++) { + JSONObject sugg = new JSONObject(); + JSONObject faqReply = faqReplies.getJSONObject(i); + sugg.put("label", Integer.toString(i + 1) + ". " + faqReply.getString("post")); + sugg.put("text", faqReply.getString("post")); + sugg.put("type", "qlist"); + suggs.put(sugg); + } + if (suggs.length() > 0) { + // TODO set help message on View Page + resp.setMessage("为您找到如下信息:"); + resp.setExpmsg(suggs.toString()); + } + } else if (data.has("params")) { + resp.setExpmsg(data.get("params").toString()); + } + + resp.setTouser(request.getUserid()); + resp.setAgentserviceid(request.getAgentserviceid()); + resp.setMsgtype(request.getMsgtype()); + resp.setUserid(request.getUserid()); + resp.setType(request.getType()); + resp.setChannel(request.getChannel()); + + resp.setContextid(request.getContextid()); + resp.setSessionid(request.getSessionid()); + resp.setUsession(request.getUsession()); + resp.setUsername(c.getName()); + resp.setUpdatetime(System.currentTimeMillis()); + + // 更新聊天机器人累计值 + updateAgentUserWithRespData(request.getUserid(), request.getOrgi(), data); + // 保存并发送 + chatbotProxy.saveAndPublish(resp); + } } else { logger.warn("[chat] can not get expected response {}", result.toString()); } diff --git a/public/plugins/chatbot/classes/PluginDescriptor.java b/public/plugins/chatbot/classes/PluginDescriptor.java index 26e4d345..097a4424 100644 --- a/public/plugins/chatbot/classes/PluginDescriptor.java +++ b/public/plugins/chatbot/classes/PluginDescriptor.java @@ -51,6 +51,8 @@ public class PluginDescriptor implements IPluginDescriptor { public Map getEnvironmentVariables() { Map env = new HashMap<>(); env.put(ChatbotConstants.BOT_PROVIDER, "https://bot.chatopera.com"); + env.put(ChatbotConstants.THRESHOLD_FAQ_BEST_REPLY, "0.8"); + env.put(ChatbotConstants.THRESHOLD_FAQ_SUGG_REPLY, "0.6"); return env; } } \ No newline at end of file diff --git a/sample.env b/sample.env index 1cbf281c..f3474a3b 100644 --- a/sample.env +++ b/sample.env @@ -10,4 +10,6 @@ ACTIVEMQ_PORT1=8051 ACTIVEMQ_PORT2=8052 ACTIVEMQ_PORT3=8053 DB_PASSWD=123456 -LOG_LEVEL=INFO \ No newline at end of file +LOG_LEVEL=INFO +BOT_THRESHOLD_FAQ_BEST_REPLY=0.8 +BOT_THRESHOLD_FAQ_SUGG_REPLY=0.6 \ No newline at end of file