diff --git a/README.md b/README.md
index caf64b9e..0c90a954 100644
--- a/README.md
+++ b/README.md
@@ -2,31 +2,23 @@
春松客服QQ交流群:185659917, 点击链接加入群聊
-
+
# 春松客服: 多渠道智能客服
春松客服帮助企业快速而低成本的获得好用的智能客服系统。
-
+
春松客服是 Chatopera 自主研发以及基于且增强其它开源软件的方式实现的,春松客服会不断增强客服系统的智能化,这包括利用自然语言处理、机器学习和语音识别等技术让客服工作更有效率、客服满意度更高、成本更低。
-**开源项目地址:** [https://github.com/chatopera/cosin](https://github.com/chatopera/cosin)
+**开源项目地址:** [https://gitee.com/chatopera/cosin](https://gitee.com/chatopera/cosin)
**开发环境搭建:** [https://docs.chatopera.com/products/cskefu/engineering.html](https://docs.chatopera.com/products/cskefu/engineering.html)
**春松客服团队博客:** [https://blog.chatopera.com/](https://blog.chatopera.com/)
-## 内容结构
-
-| | | |
-| ----------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------- |
-| [产品文档](https://docs.chatopera.com/products/cskefu/index.html) | [在线培训课程](https://github.com/chatopera/cosin#%E5%9C%A8%E7%BA%BF%E5%9F%B9%E8%AE%AD%E8%AF%BE%E7%A8%8B) | [用户案例](https://github.com/chatopera/cosin#%E7%94%A8%E6%88%B7%E6%A1%88%E4%BE%8B) |
-| [开发文档](https://github.com/chatopera/cosin#%E5%BC%80%E5%8F%91%E6%96%87%E6%A1%A3) | [产品截图](https://github.com/chatopera/cosin#%E4%BA%A7%E5%93%81%E6%88%AA%E5%9B%BE) | [产品演示](https://github.com/chatopera/cosin#%E4%BA%A7%E5%93%81%E6%BC%94%E7%A4%BA) |
-| [立即部署](https://github.com/chatopera/cosin#%E7%AB%8B%E5%8D%B3%E9%83%A8%E7%BD%B2) | [鸣谢](https://github.com/chatopera/cosin#%E9%B8%A3%E8%B0%A2) | [开源许可协议](https://github.com/chatopera/cosin#%E5%BC%80%E6%BA%90%E8%AE%B8%E5%8F%AF%E5%8D%8F%E8%AE%AE) |
-
## 产品演示
- 坐席工作台
@@ -55,7 +47,7 @@
- 坐席工作台:汇聚多渠道访客请求,坐席根据策略自动分配,自动弹屏,转接等
-- 机器人客服:集成 Chatopera 云服务,通过插件形式安装,插件也以开源形式提供,[查看插件源码](./public/plugins)。
+- 机器人客服:集成 [Chatopera 云服务](https://bot.chatopera.com),利用 Chatopera 强大的聊天机器人解决方案,提升客户服务工作中的自动化、智能化;机器人客服插件既能通过知识库联想,知识库快捷支持坐席人员,也可以直接为访客提供查询、数据收集等功能;通过插件形式安装,插件也以开源形式提供,[查看插件源码](./public/plugins)。
- 企业聊天:支持企业员工在春松客服系统中群聊和私聊
@@ -84,7 +76,7 @@
主讲老师介绍
-
+
@@ -93,11 +85,11 @@
TA们都选择春松客服
-
+
-## 社区这样评价春松客服
+## 企业用户这样评价我们
```
The collaboration is efficient, very professional. The software is steady with high quality services.
@@ -122,58 +114,78 @@ The collaboration is efficient, very professional. The software is steady with h
开发文档
-
+
+## 寻找开发者
+
+寻找开发者合作智能客服项目,社区共建,携手共赢!
+
+* 组织或个人,在春松客服主页展示为认证开发者
+* 春松客服官方推荐项目机会
+* 专访并通过官方渠道曝光
+
+填写申请:[https://www.wjx.top/jq/93397428.aspx](https://www.wjx.top/jq/93397428.aspx)
+
## 产品截图
欢迎页
-
+
+
+
+
+展开查看更多产品截图
+
+
坐席工作台
-
+
坐席监控
-
+
外呼计划
-
+
通话记录
-
+
集成客服机器人
-
+
客服机器人应答
-
+
更多功能,敬请期待 ...
-
+
+
+
+
## 立即部署
- 私有部署版
参考部署[开源社区版本文档](https://docs.chatopera.com/products/cskefu/deploy.html)。
+
## 鸣谢
[FreeSWITCH 中国社区](http://www.freeswitch.org.cn/)
@@ -182,9 +194,79 @@ The collaboration is efficient, very professional. The software is steady with h
Copyright (2018-2020) 北京华夏春松科技有限公司
-[Apache License Version 2.0](https://github.com/chatopera/cosin/blob/master/LICENSE)
+[Apache License Version 2.0](https://gitee.com/chatopera/cosin/blob/master/LICENSE)
[![chatoper banner][co-banner-image]][co-url]
-[co-banner-image]: https://user-images.githubusercontent.com/3538629/42383104-da925942-8168-11e8-8195-868d5fcec170.png
+[co-banner-image]: https://static-public.chatopera.com/assets/images/42383104-da925942-8168-11e8-8195-868d5fcec170.png
[co-url]: https://www.chatopera.com
+
+
+
+## Chatopera 云服务
+
+[https://bot.chatopera.com/](https://bot.chatopera.com/)
+
+[Chatopera 云服务](https://bot.chatopera.com)是一站式实现聊天机器人的云服务,按接口调用次数计费。Chatopera 云服务是 [Chatopera 机器人平台](https://docs.chatopera.com/products/chatbot-platform/index.html)的软件即服务实例。在云计算基础上,Chatopera 云服务属于**聊天机器人即服务**的云服务。
+
+Chatopera 机器人平台包括知识库、多轮对话、意图识别和语音识别等组件,标准化聊天机器人开发,支持企业 OA 智能问答、HR 智能问答、智能客服和网络营销等场景。企业 IT 部门、业务部门借助 Chatopera 云服务快速让聊天机器人上线!
+
+
+展开查看 Chatopera 云服务的产品截图
+
+
+
+ 自定义词典
+
+
+
+
+ 自定义词条
+
+
+
+
+ 创建意图
+
+
+
+
+ 添加说法和槽位
+
+
+
+
+ 训练模型
+
+
+
+
+ 测试对话
+
+
+
+
+ 机器人画像
+
+
+
+
+ 系统集成
+
+
+
+
+ 聊天历史
+
+
+
+
+
+
+
+
+ 立即使用
+
+
+
+
diff --git a/contact-center/app/pom.xml b/contact-center/app/pom.xml
index 1360f364..02ff7672 100644
--- a/contact-center/app/pom.xml
+++ b/contact-center/app/pom.xml
@@ -373,7 +373,7 @@
com.chatopera.bot
sdk
- 2.1.0
+ 3.1.0
diff --git a/contact-center/app/src/main/java/com/chatopera/cc/controller/ApplicationController.java b/contact-center/app/src/main/java/com/chatopera/cc/controller/ApplicationController.java
index 433cb239..5d360147 100644
--- a/contact-center/app/src/main/java/com/chatopera/cc/controller/ApplicationController.java
+++ b/contact-center/app/src/main/java/com/chatopera/cc/controller/ApplicationController.java
@@ -54,6 +54,10 @@ public class ApplicationController extends Handler {
@Autowired
private Cache cache;
+ @Value("${tongji.baidu.sitekey}")
+ private String tongjiBaiduSiteKey;
+
+
@RequestMapping("/")
public ModelAndView admin(HttpServletRequest request) {
// logger.info("[admin] path {} queryString {}", request.getPathInfo(),request.getQueryString());
@@ -85,6 +89,12 @@ public class ApplicationController extends Handler {
}
}
view.addObject("agentStatus", cache.findOneAgentStatusByAgentnoAndOrig(logined.getId(), logined.getOrgi()));
+
+ if (StringUtils.isNotBlank(tongjiBaiduSiteKey) && !StringUtils.equalsIgnoreCase(tongjiBaiduSiteKey, "placeholder")) {
+ logger.info("tongjiBaiduSiteKey: {}", tongjiBaiduSiteKey);
+ view.addObject("tongjiBaiduSiteKey", tongjiBaiduSiteKey);
+ }
+
return view;
}
diff --git a/contact-center/app/src/main/java/com/chatopera/cc/controller/LoginController.java b/contact-center/app/src/main/java/com/chatopera/cc/controller/LoginController.java
index af59ee0f..36394a8c 100644
--- a/contact-center/app/src/main/java/com/chatopera/cc/controller/LoginController.java
+++ b/contact-center/app/src/main/java/com/chatopera/cc/controller/LoginController.java
@@ -39,6 +39,7 @@ import org.jasypt.exceptions.EncryptionOperationNotPossibleException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
@@ -90,6 +91,12 @@ public class LoginController extends Handler {
@Autowired
private ACDWorkMonitor acdWorkMonitor;
+ @Value("${tongji.baidu.sitekey}")
+ private String tongjiBaiduSiteKey;
+
+ @Value("${ads.login.banner}")
+ private String adsLoginBanner;
+
/**
* 登录页面
*
@@ -149,6 +156,15 @@ public class LoginController extends Handler {
if (systemConfig != null) {
view.addObject("systemConfig", systemConfig);
}
+
+ if (StringUtils.isNotBlank(tongjiBaiduSiteKey) && !StringUtils.equalsIgnoreCase(tongjiBaiduSiteKey, "placeholder")) {
+ view.addObject("tongjiBaiduSiteKey", tongjiBaiduSiteKey);
+ }
+
+ if(StringUtils.isNotBlank(adsLoginBanner) && StringUtils.equalsIgnoreCase(adsLoginBanner, "on")){
+ view.addObject("adsLoginBanner", "on");
+ }
+
return view;
}
@@ -211,14 +227,14 @@ public class LoginController extends Handler {
// 工作状态记录
acdWorkMonitor.recordAgentStatus(agentStatus.getAgentno(),
- agentStatus.getUsername(),
- agentStatus.getAgentno(),
- user.isAdmin(), // 0代表admin
- agentStatus.getAgentno(),
- MainContext.AgentStatusEnum.OFFLINE.toString(),
- MainContext.AgentStatusEnum.READY.toString(),
- MainContext.AgentWorkType.MEIDIACHAT.toString(),
- orgi, null);
+ agentStatus.getUsername(),
+ agentStatus.getAgentno(),
+ user.isAdmin(), // 0代表admin
+ agentStatus.getAgentno(),
+ MainContext.AgentStatusEnum.OFFLINE.toString(),
+ MainContext.AgentStatusEnum.READY.toString(),
+ MainContext.AgentWorkType.MEIDIACHAT.toString(),
+ orgi, null);
} catch (Exception e) {
logger.error("[login] set agent status", e);
diff --git a/contact-center/app/src/main/java/com/chatopera/cc/controller/admin/system/TemplateController.java b/contact-center/app/src/main/java/com/chatopera/cc/controller/admin/system/TemplateController.java
index 5014a165..49f26988 100644
--- a/contact-center/app/src/main/java/com/chatopera/cc/controller/admin/system/TemplateController.java
+++ b/contact-center/app/src/main/java/com/chatopera/cc/controller/admin/system/TemplateController.java
@@ -67,7 +67,7 @@ public class TemplateController extends Handler{
@Menu(type = "admin" , subtype = "template" , access = false , admin = true)
public void expall(ModelMap map , HttpServletRequest request , HttpServletResponse response) throws Exception {
List templateList = templateRes.findByOrgi(super.getOrgi(request)) ;
- response.setHeader("content-disposition", "attachment;filename=UCKeFu-Template-Export-"+new SimpleDateFormat("yyyy-MM-dd").format(new Date())+".data");
+ response.setHeader("content-disposition", "attachment;filename=CSKeFu-Template-Export-"+new SimpleDateFormat("yyyy-MM-dd").format(new Date())+".data");
response.getOutputStream().write(MainUtils.toBytes(templateList));
return ;
}
diff --git a/contact-center/app/src/main/java/com/chatopera/cc/controller/apps/CustomerController.java b/contact-center/app/src/main/java/com/chatopera/cc/controller/apps/CustomerController.java
index 1ed0590e..d38e9668 100644
--- a/contact-center/app/src/main/java/com/chatopera/cc/controller/apps/CustomerController.java
+++ b/contact-center/app/src/main/java/com/chatopera/cc/controller/apps/CustomerController.java
@@ -355,7 +355,7 @@ public class CustomerController extends Handler {
values.add(MainUtils.transBean2Map(customer));
}
- response.setHeader("content-disposition", "attachment;filename=UCKeFu-EntCustomer-" + new SimpleDateFormat("yyyy-MM-dd").format(new Date()) + ".xls");
+ response.setHeader("content-disposition", "attachment;filename=CSKeFu-EntCustomer-" + new SimpleDateFormat("yyyy-MM-dd").format(new Date()) + ".xls");
ExcelExporterProcess excelProcess = new ExcelExporterProcess(values, table, response.getOutputStream());
excelProcess.process();
@@ -382,7 +382,7 @@ public class CustomerController extends Handler {
values.add(MainUtils.transBean2Map(customer));
}
- response.setHeader("content-disposition", "attachment;filename=UCKeFu-EntCustomer-" + new SimpleDateFormat("yyyy-MM-dd").format(new Date()) + ".xls");
+ response.setHeader("content-disposition", "attachment;filename=CSKeFu-EntCustomer-" + new SimpleDateFormat("yyyy-MM-dd").format(new Date()) + ".xls");
ExcelExporterProcess excelProcess = new ExcelExporterProcess(values, table, response.getOutputStream());
excelProcess.process();
@@ -413,7 +413,7 @@ public class CustomerController extends Handler {
values.add(MainUtils.transBean2Map(customer));
}
- response.setHeader("content-disposition", "attachment;filename=UCKeFu-EntCustomer-" + new SimpleDateFormat("yyyy-MM-dd").format(new Date()) + ".xls");
+ response.setHeader("content-disposition", "attachment;filename=CSKeFu-EntCustomer-" + new SimpleDateFormat("yyyy-MM-dd").format(new Date()) + ".xls");
ExcelExporterProcess excelProcess = new ExcelExporterProcess(values, table, response.getOutputStream());
excelProcess.process();
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 0840551e..27f1af87 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
@@ -281,7 +281,7 @@ public class IMController extends Handler {
/**
* 查询坐席 , 缓存?
*/
- view.addObject("agentList", OnlineUserProxy.agents(MainContext.SYSTEM_ORGI, true));
+ view.addObject("agentList", OnlineUserProxy.agents(MainContext.SYSTEM_ORGI));
}
view.addObject("traceid", userHistory.getId());
diff --git a/contact-center/app/src/main/java/com/chatopera/cc/controller/apps/QuickReplyController.java b/contact-center/app/src/main/java/com/chatopera/cc/controller/apps/QuickReplyController.java
index cdcdca9c..bef4f892 100644
--- a/contact-center/app/src/main/java/com/chatopera/cc/controller/apps/QuickReplyController.java
+++ b/contact-center/app/src/main/java/com/chatopera/cc/controller/apps/QuickReplyController.java
@@ -282,7 +282,7 @@ public class QuickReplyController extends Handler {
values.add(MainUtils.transBean2Map(topic)) ;
}
- response.setHeader("content-disposition", "attachment;filename=UCKeFu-QuickReply-"+new SimpleDateFormat("yyyy-MM-dd").format(new Date())+".xls");
+ response.setHeader("content-disposition", "attachment;filename=CSKeFu-QuickReply-"+new SimpleDateFormat("yyyy-MM-dd").format(new Date())+".xls");
if(table!=null){
ExcelExporterProcess excelProcess = new ExcelExporterProcess( values, table, response.getOutputStream()) ;
excelProcess.process();
@@ -303,7 +303,7 @@ public class QuickReplyController extends Handler {
values.add(MainUtils.transBean2Map(topic)) ;
}
- response.setHeader("content-disposition", "attachment;filename=UCKeFu-QuickReply-"+new SimpleDateFormat("yyyy-MM-dd").format(new Date())+".xls");
+ response.setHeader("content-disposition", "attachment;filename=CSKeFu-QuickReply-"+new SimpleDateFormat("yyyy-MM-dd").format(new Date())+".xls");
if(table!=null){
ExcelExporterProcess excelProcess = new ExcelExporterProcess( values, table, response.getOutputStream()) ;
@@ -324,7 +324,7 @@ public class QuickReplyController extends Handler {
values.add(MainUtils.transBean2Map(topic)) ;
}
- response.setHeader("content-disposition", "attachment;filename=UCKeFu-QuickReply-"+new SimpleDateFormat("yyyy-MM-dd").format(new Date())+".xls");
+ response.setHeader("content-disposition", "attachment;filename=CSKeFu-QuickReply-"+new SimpleDateFormat("yyyy-MM-dd").format(new Date())+".xls");
if(table!=null){
ExcelExporterProcess excelProcess = new ExcelExporterProcess( values, table, response.getOutputStream()) ;
diff --git a/contact-center/app/src/main/java/com/chatopera/cc/controller/apps/TopicController.java b/contact-center/app/src/main/java/com/chatopera/cc/controller/apps/TopicController.java
index 9fbbd110..139f8392 100644
--- a/contact-center/app/src/main/java/com/chatopera/cc/controller/apps/TopicController.java
+++ b/contact-center/app/src/main/java/com/chatopera/cc/controller/apps/TopicController.java
@@ -425,7 +425,7 @@ public class TopicController extends Handler{
values.add(MainUtils.transBean2Map(topic)) ;
}
- response.setHeader("content-disposition", "attachment;filename=UCKeFu-XiaoE-"+new SimpleDateFormat("yyyy-MM-dd").format(new Date())+".xls");
+ response.setHeader("content-disposition", "attachment;filename=CSKeFu-XiaoE-"+new SimpleDateFormat("yyyy-MM-dd").format(new Date())+".xls");
if(table!=null){
ExcelExporterProcess excelProcess = new ExcelExporterProcess( values, table, response.getOutputStream()) ;
@@ -446,7 +446,7 @@ public class TopicController extends Handler{
values.add(MainUtils.transBean2Map(topic)) ;
}
- response.setHeader("content-disposition", "attachment;filename=UCKeFu-XiaoE-"+new SimpleDateFormat("yyyy-MM-dd").format(new Date())+".xls");
+ response.setHeader("content-disposition", "attachment;filename=CSKeFu-XiaoE-"+new SimpleDateFormat("yyyy-MM-dd").format(new Date())+".xls");
if(table!=null){
ExcelExporterProcess excelProcess = new ExcelExporterProcess( values, table, response.getOutputStream()) ;
diff --git a/contact-center/app/src/main/java/com/chatopera/cc/controller/apps/report/ReportController.java b/contact-center/app/src/main/java/com/chatopera/cc/controller/apps/report/ReportController.java
index 0735e1a5..c70662ed 100644
--- a/contact-center/app/src/main/java/com/chatopera/cc/controller/apps/report/ReportController.java
+++ b/contact-center/app/src/main/java/com/chatopera/cc/controller/apps/report/ReportController.java
@@ -286,7 +286,7 @@ public class ReportController extends Handler{
values.add(MainUtils.transBean2Map(topic)) ;
}
- response.setHeader("content-disposition", "attachment;filename=UCKeFu-Report-"+new SimpleDateFormat("yyyy-MM-dd").format(new Date())+".xls");
+ response.setHeader("content-disposition", "attachment;filename=CSKeFu-Report-"+new SimpleDateFormat("yyyy-MM-dd").format(new Date())+".xls");
if(table!=null){
ExcelExporterProcess excelProcess = new ExcelExporterProcess( values, table, response.getOutputStream()) ;
excelProcess.process();
@@ -307,7 +307,7 @@ public class ReportController extends Handler{
values.add(MainUtils.transBean2Map(report)) ;
}
- response.setHeader("content-disposition", "attachment;filename=UCKeFu-Report-"+new SimpleDateFormat("yyyy-MM-dd").format(new Date())+".xls");
+ response.setHeader("content-disposition", "attachment;filename=CSKeFu-Report-"+new SimpleDateFormat("yyyy-MM-dd").format(new Date())+".xls");
if(table!=null){
ExcelExporterProcess excelProcess = new ExcelExporterProcess( values, table, response.getOutputStream()) ;
diff --git a/contact-center/app/src/main/java/com/chatopera/cc/controller/apps/service/AgentSummaryController.java b/contact-center/app/src/main/java/com/chatopera/cc/controller/apps/service/AgentSummaryController.java
index 4eb167f3..62b67e64 100644
--- a/contact-center/app/src/main/java/com/chatopera/cc/controller/apps/service/AgentSummaryController.java
+++ b/contact-center/app/src/main/java/com/chatopera/cc/controller/apps/service/AgentSummaryController.java
@@ -161,7 +161,7 @@ public class AgentSummaryController extends Handler{
values.add(MainUtils.transBean2Map(event)) ;
}
- response.setHeader("content-disposition", "attachment;filename=UCKeFu-Summary-History-"+new SimpleDateFormat("yyyy-MM-dd").format(new Date())+".xls");
+ response.setHeader("content-disposition", "attachment;filename=CSKeFu-Summary-History-"+new SimpleDateFormat("yyyy-MM-dd").format(new Date())+".xls");
ExcelExporterProcess excelProcess = new ExcelExporterProcess( values, table, response.getOutputStream()) ;
excelProcess.process();
@@ -182,7 +182,7 @@ public class AgentSummaryController extends Handler{
values.add(MainUtils.transBean2Map(statusEvent)) ;
}
- response.setHeader("content-disposition", "attachment;filename=UCKeFu-Summary-History-"+new SimpleDateFormat("yyyy-MM-dd").format(new Date())+".xls");
+ response.setHeader("content-disposition", "attachment;filename=CSKeFu-Summary-History-"+new SimpleDateFormat("yyyy-MM-dd").format(new Date())+".xls");
ExcelExporterProcess excelProcess = new ExcelExporterProcess( values, table, response.getOutputStream()) ;
excelProcess.process();
@@ -220,7 +220,7 @@ public class AgentSummaryController extends Handler{
values.add(MainUtils.transBean2Map(summary)) ;
}
- response.setHeader("content-disposition", "attachment;filename=UCKeFu-Summary-History-"+new SimpleDateFormat("yyyy-MM-dd").format(new Date())+".xls");
+ response.setHeader("content-disposition", "attachment;filename=CSKeFu-Summary-History-"+new SimpleDateFormat("yyyy-MM-dd").format(new Date())+".xls");
MetadataTable table = metadataRes.findByTablename("uk_servicesummary") ;
diff --git a/contact-center/app/src/main/java/com/chatopera/cc/controller/apps/service/ProcessedSummaryController.java b/contact-center/app/src/main/java/com/chatopera/cc/controller/apps/service/ProcessedSummaryController.java
index 1bbd2112..d37f746d 100644
--- a/contact-center/app/src/main/java/com/chatopera/cc/controller/apps/service/ProcessedSummaryController.java
+++ b/contact-center/app/src/main/java/com/chatopera/cc/controller/apps/service/ProcessedSummaryController.java
@@ -169,7 +169,7 @@ public class ProcessedSummaryController extends Handler{
values.add(MainUtils.transBean2Map(event)) ;
}
- response.setHeader("content-disposition", "attachment;filename=UCKeFu-Summary-History-"+new SimpleDateFormat("yyyy-MM-dd").format(new Date())+".xls");
+ response.setHeader("content-disposition", "attachment;filename=CSKeFu-Summary-History-"+new SimpleDateFormat("yyyy-MM-dd").format(new Date())+".xls");
ExcelExporterProcess excelProcess = new ExcelExporterProcess( values, table, response.getOutputStream()) ;
excelProcess.process();
@@ -190,7 +190,7 @@ public class ProcessedSummaryController extends Handler{
values.add(MainUtils.transBean2Map(statusEvent)) ;
}
- response.setHeader("content-disposition", "attachment;filename=UCKeFu-Summary-History-"+new SimpleDateFormat("yyyy-MM-dd").format(new Date())+".xls");
+ response.setHeader("content-disposition", "attachment;filename=CSKeFu-Summary-History-"+new SimpleDateFormat("yyyy-MM-dd").format(new Date())+".xls");
ExcelExporterProcess excelProcess = new ExcelExporterProcess( values, table, response.getOutputStream()) ;
excelProcess.process();
@@ -233,7 +233,7 @@ public class ProcessedSummaryController extends Handler{
values.add(MainUtils.transBean2Map(summary)) ;
}
- response.setHeader("content-disposition", "attachment;filename=UCKeFu-Summary-History-"+new SimpleDateFormat("yyyy-MM-dd").format(new Date())+".xls");
+ response.setHeader("content-disposition", "attachment;filename=CSKeFu-Summary-History-"+new SimpleDateFormat("yyyy-MM-dd").format(new Date())+".xls");
MetadataTable table = metadataRes.findByTablename("uk_servicesummary") ;
diff --git a/contact-center/app/src/main/java/com/chatopera/cc/controller/apps/service/StatsController.java b/contact-center/app/src/main/java/com/chatopera/cc/controller/apps/service/StatsController.java
index aaba3026..0a1fd75a 100644
--- a/contact-center/app/src/main/java/com/chatopera/cc/controller/apps/service/StatsController.java
+++ b/contact-center/app/src/main/java/com/chatopera/cc/controller/apps/service/StatsController.java
@@ -100,7 +100,7 @@ public class StatsController extends Handler {
/**
* 查询坐席 , 缓存?
*/
- map.addAttribute("agentList", OnlineUserProxy.agents(super.getOrgi(request), true));
+ map.addAttribute("agentList", OnlineUserProxy.agents(super.getOrgi(request)));
return request(super.createAppsTempletResponse("/apps/service/stats/coment"));
}
@@ -121,7 +121,7 @@ public class StatsController extends Handler {
}
}
- response.setHeader("content-disposition", "attachment;filename=UCKeFu-Report-" + new SimpleDateFormat("yyyy-MM-dd").format(new Date()) + ".xls");
+ response.setHeader("content-disposition", "attachment;filename=CSKeFu-Report-" + new SimpleDateFormat("yyyy-MM-dd").format(new Date()) + ".xls");
new UKExcelUtil(reportData, response.getOutputStream(), "满意度统计").createFile();
return;
@@ -154,7 +154,7 @@ public class StatsController extends Handler {
/**
* 查询坐席 , 缓存?
*/
- map.addAttribute("agentList", OnlineUserProxy.agents(super.getOrgi(request), true));
+ map.addAttribute("agentList", OnlineUserProxy.agents(super.getOrgi(request)));
return request(super.createAppsTempletResponse("/apps/service/stats/consult"));
}
@@ -165,7 +165,7 @@ public class StatsController extends Handler {
Map mapR = MainUtils.getRequestParam(request);
mapR.put("orgi", super.getOrgi(request));
ReportData reportData = new CubeService("consult.xml", path, dataSource, mapR).execute("SELECT {[Measures].[咨询数量],[Measures].[平均等待时长(秒)],[Measures].[平均咨询时长(秒)]} on columns , NonEmptyCrossJoin([time].[日期].members , NonEmptyCrossJoin([skill].[技能组].members,[agent].[坐席].members)) on rows FROM [咨询]");
- response.setHeader("content-disposition", "attachment;filename=UCKeFu-Report-" + new SimpleDateFormat("yyyy-MM-dd").format(new Date()) + ".xls");
+ response.setHeader("content-disposition", "attachment;filename=CSKeFu-Report-" + new SimpleDateFormat("yyyy-MM-dd").format(new Date()) + ".xls");
new UKExcelUtil(reportData, response.getOutputStream(), "客服坐席统计").createFile();
return;
diff --git a/contact-center/app/src/main/java/com/chatopera/cc/proxy/OnlineUserProxy.java b/contact-center/app/src/main/java/com/chatopera/cc/proxy/OnlineUserProxy.java
index bca3439a..38f73df8 100644
--- a/contact-center/app/src/main/java/com/chatopera/cc/proxy/OnlineUserProxy.java
+++ b/contact-center/app/src/main/java/com/chatopera/cc/proxy/OnlineUserProxy.java
@@ -63,6 +63,7 @@ public class OnlineUserProxy {
private static AgentUserContactsRepository agentUserContactsRes;
private static ContactsRepository contactsRes;
private static UserProxy userProxy;
+ private static OrganRepository organRes;
/**
* @param id
@@ -325,47 +326,36 @@ public class OnlineUserProxy {
/**
- * @param orgi
- * @param isJudgeShare
+ * @param orgi 一个坐席可以添加到多个组织,原租户共享功能废弃
* @return
*/
@SuppressWarnings("unchecked")
- public static List agents(String orgi, boolean isJudgeShare) {
+ public static List agents(String orgi) {
String origOrig = orgi;
- boolean isShare = false;
- if (isJudgeShare) {
- SystemConfig systemConfig = MainUtils.getSystemConfig();
- if (systemConfig != null && systemConfig.isEnabletneant() && systemConfig.isTenantshare()) {
- orgi = MainContext.SYSTEM_ORGI;
- isShare = true;
- }
- }
- List agentList = getCache().findOneSystemByIdAndOrgi(Constants.CACHE_AGENT + origOrig, origOrig);
- List agentTempList = null;
- if (agentList == null) {
- agentList = getUserRes().findByOrgiAndAgentAndDatastatus(orgi, true, false);
- agentTempList = new ArrayList();
- // 共享的话 查出绑定的组织
- if (isShare) {
- List orgiSkillRelList = getOrgiSkillRelRes().findByOrgi(origOrig);
- if (!orgiSkillRelList.isEmpty()) {
- for (User user : agentList) {
- // TODO 此处的查询处理比较多,应使用缓存
- // 一个用户可隶属于多个组织
- getUserProxy().attachOrgansPropertiesForUser(user);
- for (OrgiSkillRel rel : orgiSkillRelList) {
- if (user.getOrgans().size() > 0 && user.inAffiliates(rel.getSkillid())) {
- agentTempList.add(user);
- }
- }
+
+ List agentList = getUserRes().findByOrgiAndAgentAndDatastatus(orgi, true, false);
+ List agentTempList = new ArrayList();
+ List skillOrgansByOrgi = getOrganRes().findByOrgiAndSkill(origOrig, true);
+
+ if (!skillOrgansByOrgi.isEmpty()) {
+ for (User user : agentList) {
+ // 跳过管理员角色用户,不显示在技能组列表
+ if (user.isAdmin() || user.isSuperadmin()) continue;
+
+ // 只显示在线的客服,跳过离线的客服
+ if (getCache().findOneAgentStatusByAgentnoAndOrig(user.getId(), origOrig) == null) continue;
+
+ // 一个用户可隶属于多个组织
+ getUserProxy().attachOrgansPropertiesForUser(user);
+ for (Organ organ : skillOrgansByOrgi) {
+ if (user.getOrgans().size() > 0 && user.inAffiliates(organ.getId())) {
+ agentTempList.add(user);
}
}
- agentList = agentTempList;
- }
- if (agentList.size() > 0) {
- getCache().putSystemListByIdAndOrgi(Constants.CACHE_AGENT + origOrig, origOrig, agentList);
}
}
+ agentList = agentTempList;
+
return agentList;
}
@@ -508,7 +498,7 @@ public class OnlineUserProxy {
onlineUser.setOlduser("1");
}
onlineUser.setMobile(MobileDevice.isMobile(request
- .getHeader("User-Agent")) ? "1" : "0");
+ .getHeader("User-Agent")) ? "1" : "0");
// onlineUser.setSource(user.getId());
@@ -546,10 +536,10 @@ public class OnlineUserProxy {
onlineUser.setCity(ipdata.getCity());
onlineUser.setIsp(ipdata.getIsp());
onlineUser.setRegion(ipdata.toString() + "("
- + ip + ")");
+ + ip + ")");
onlineUser.setDatestr(new SimpleDateFormat("yyyMMdd")
- .format(now));
+ .format(now));
onlineUser.setHostname(ip);
onlineUser.setSessionid(sessionid);
@@ -1030,6 +1020,13 @@ public class OnlineUserProxy {
return userRes;
}
+ private static OrganRepository getOrganRes() {
+ if (organRes == null) {
+ organRes = MainContext.getContext().getBean(OrganRepository.class);
+ }
+ return organRes;
+ }
+
private static OrgiSkillRelRepository getOrgiSkillRelRes() {
if (orgiSkillRelRes == null) {
orgiSkillRelRes = MainContext.getContext().getBean(OrgiSkillRelRepository.class);
diff --git a/contact-center/app/src/main/resources/application.properties b/contact-center/app/src/main/resources/application.properties
index e85e7ef3..0bfda320 100644
--- a/contact-center/app/src/main/resources/application.properties
+++ b/contact-center/app/src/main/resources/application.properties
@@ -185,6 +185,7 @@ cskefu.callout.watch.interval=60000
# 企业聊天机器人
##############################################
bot.baseurl=https://bot.chatopera.com
+ads.login.banner=placeholder
##############################################
# 业务功能相关设置
@@ -228,4 +229,14 @@ endpoints.loggers.enabled=false
endpoints.configprops.enabled=false
endpoints.mappings.enabled=false
endpoints.shutdown.enabled=false
-endpoints.trace.enabled=false
\ No newline at end of file
+endpoints.trace.enabled=false
+
+##############################################
+# 百度统计 Key
+# https://tongji.baidu.com/
+# 汇总使用情况:登录,打开页面,etc.
+# 登录 -> 管理 -> 新增网站 -> 代码获取 -> 拷贝SiteKey
+# hm.src = "https://hm.baidu.com/hm.js?YOUR_SITE_KEY";
+# 加入后在百度统计内点击:代码安装检查,代码检查成功表示安装成功;注意网站域名等一致,数据收集有延迟。
+##############################################
+tongji.baidu.sitekey=
\ No newline at end of file
diff --git a/contact-center/app/src/main/resources/static/css/login.css b/contact-center/app/src/main/resources/static/css/login.css
index 9055e660..af2620c3 100644
--- a/contact-center/app/src/main/resources/static/css/login.css
+++ b/contact-center/app/src/main/resources/static/css/login.css
@@ -70,7 +70,7 @@ html { *overflow:auto; font-family:"Microsoft Yahei","Helvetica","Simsun","Arial
background-repeat: no-repeat;
background-position: 50%;
background-size: 100%;
- padding: 20px 0;
+ padding: 0 0;
position: relative;
}
.login-box-body, .register-box-body{
diff --git a/contact-center/app/src/main/resources/static/js/CSKeFu_IM.v1.js b/contact-center/app/src/main/resources/static/js/CSKeFu_IM.v1.js
index af83d887..42686728 100644
--- a/contact-center/app/src/main/resources/static/js/CSKeFu_IM.v1.js
+++ b/contact-center/app/src/main/resources/static/js/CSKeFu_IM.v1.js
@@ -7,15 +7,15 @@ $(document).ready(function(){
var protocol = window.location.protocol.replace(/:/g,'');
socket = io(protocol+'://'+hostname+':'+port+'/im/agent?orgi='+orgi+"&userid="+userid+"&session="+session+"&admin="+adminuser , {transports: ['websocket'], upgrade: false});
socket.on('connect',function() {
- console.log("连接初始化成功");
+ console.log("[IM] 连接初始化成功");
//请求服务端记录 当前用户在线事件
}).on('disconnect',function() {
- console.log("连接已断开");
+ console.log("[IM] 连接已断开");
//请求服务端记录,当前用户离线
});
socket.on('chatevent', function(data) {
- console.log(data.messageType + " ..... message:"+data.message);
+ // console.log(data.messageType + " ..... message:"+data.message);
}).on('task', function(data) {
}).on('new', function(data) {
@@ -151,8 +151,8 @@ var WebIM = {
});
},
ping : function(){
- loadURL("/message/ping.html") ;
- console.log("ping:" + new Date().getTime());
+ loadURL("/message/ping.html") ;
+ console.log("[IM] heartbeat: " + new Date().getTime())
},
audioplayer:function(id, file, loop) {
var audioplayer = document.getElementById(id);
diff --git a/contact-center/app/src/main/resources/static/js/cskefu.js b/contact-center/app/src/main/resources/static/js/cskefu.js
index bc707c76..30d22ad4 100644
--- a/contact-center/app/src/main/resources/static/js/cskefu.js
+++ b/contact-center/app/src/main/resources/static/js/cskefu.js
@@ -382,14 +382,24 @@ var Proxy = {
if(result.data.length>0){
type == "agent" ? $("#quickReplyBox").html("") : $("#ccaQuickReplyBox").html("") ;
$.each(sortByKey(result.data,'score'),function(i,n){
- var li = ' \n' +
- ' 问题:'+result.data[i].post+'
\n' +
- ' \n' +
- '
答案:'+result.data[i].reply_plain_text+'
\n' +
- '
选择 \n' +
- '
\n' +
- ' '
- type == "agent" ? $("#quickReplyBox").append(li) : $("#ccaQuickReplyBox").append(li) ;
+ var answerList = result.data[i].replies;
+ var answer;
+ for(var i = 0; i < answerList.length; i++) {
+ if(answerList[i].rtype == 'plain' && answerList[i].enabled==true) {
+ answer=answerList[i]
+ break;
+ }
+ }
+ if(answer) {
+ var li = ' \n' +
+ ' 问题:' + result.data[i].post + '
\n' +
+ ' \n' +
+ '
答案:' + answer.content + '
\n' +
+ '
选择 \n' +
+ '
\n' +
+ ' '
+ type == "agent" ? $("#quickReplyBox").append(li) : $("#ccaQuickReplyBox").append(li);
+ }
if(i>4){
return false;
}
diff --git a/contact-center/app/src/main/resources/static/testclient.html b/contact-center/app/src/main/resources/static/testclient.html
index 62aa840e..545281c5 100644
--- a/contact-center/app/src/main/resources/static/testclient.html
+++ b/contact-center/app/src/main/resources/static/testclient.html
@@ -1,10 +1,11 @@
+
-
-
+
+
全渠道智能客服
@@ -29,34 +30,47 @@
+
-全渠道智能客服演示客户端
+ 全渠道智能客服演示客户端
-设置网站渠道
-以管理员身份
-登录 ,导航【系统-客服接入-网站列表-创建新网站】,按照如下内容设置网站渠道。
+ 设置网站渠道
+ 以管理员身份
+ 登录 ,导航【系统-客服接入-网站列表-创建新网站】,按照如下内容设置网站渠道。
-
-
- 设置
- 值
- 描述
-
-
- 网站名称
- localhost
- 任意字符串
-
-
- 网站地址
- localhost
- 网站的域名或IP,端口选填,比如 localhost:8080
-
-
+
+
+ 设置
+ 值
+ 描述
+
+
+ 网站名称
+ localhost
+ 任意字符串
+
+
+ 网站地址
+ localhost
+ 网站的域名或IP,端口选填,比如 localhost:8080
+
+
-然后,刷新本页面,就可以在右下角看到【在线客服】聊天控件。
-
+ 然后,刷新本页面,就可以在右下角看到【在线客服】聊天控件。
+
+
+
+ 寻找开发者
+ 寻找开发者合作智能客服项目,社区共建,携手共赢!
+
+ 组织或个人,在春松客服主页展示为认证开发者
+ 春松客服官方推荐项目机会
+ 专访并通过官方渠道曝光
+
+ 填写申请:https://www.wjx.top/jq/93397428.aspx
+
+
-
+
+